2_1逆波兰.c

时间:2022-07-20 16:16:46
【文件属性】:

文件名称:2_1逆波兰.c

文件大小:8KB

文件格式:C

更新时间:2022-07-20 16:16:46

数据结构

数据结构课程设计简易运算器 #include #include #include #include #include #include using namespace std; char str[50]; //用于存放原来的表达式 int top; //栈顶指针 char stack[50]; //定义栈,用于计算逆波兰式 char ex[50]; //存放后缀表达式 double _stack[50]; //定义栈,用于计算逆波兰式子 int flag[50]; //用于区分+、-号的含义,0表示运算符,1表示正负号 //生成逆波兰式 void NiBolan() { memset(flag,0,sizeof(flag)); //flag初始值设为0 char ch=str[0]; int i=1,t=0; top=0; while(ch!='#') { switch(ch) { case '(': top++; stack[top]=ch; break; case ')': while(stack[top]!='(') { ex[t]=stack[top]; top--; t++; } top--; break; case '^': while(stack[top]=='^') //设置^运算符优先级为最高 { ex[t]=stack[top]; top--; t++; } top++; stack[top]=ch; break; case '+': case '-': //当ch为+、-号是,若前面相邻字符不是')'或数字且后面相邻字符是数字时表示正负号 if(isdigit(str[i]) && !isdigit(str[i-2]) && str[i-2]!=')') { flag[t]=1; //标记符号为正负号 ex[t++]=ch; ch=str[i++]; while((ch>='0'&&ch;<='9')||ch=='.') //判别小数点 { ex[t]=ch; t++; ch=str[i]; i++; } i--; ex[t]=' '; t++; } else { while(top!=0&&stack;[top]!='(') { ex[t]=stack[top]; top--; t++; } top++; stack[top]=ch; } break; case '*': case '/': while(stack[top]=='*'||stack[top]=='/'||stack[top]=='^') //运算符^优先级高于*和/ { ex[t]=stack[top]; top--; t++; } top++; stack[top]=ch; break; case ' ': break; default: while((ch>='0'&&ch;<='9')||ch=='.') //判别小数点 { ex[t]=ch; t++; ch=str[i]; i++; } i--; ex[t]=' '; t++; } ch=str[i]; i++; } while(top!=0) if(stack[top]!='(') { ex[t]=stack[top]; t++; top--; } else { printf("error"); top--; exit(0); } ex[t]='#'; ex[t+1]='\0'; printf("后缀表达式:%s\n",ex); } //计算逆波兰式 void Calculate() { char ch=ex[0]; int t=0; top=-1; while(ch!='#') { if(ch==' '){ ch=ex[++t]; continue; } switch(ch) { case '+': if(flag[t]) //'+'表示正号 { ch=ex[++t]; double d=0; while(ch>='0'&&ch;<='9') { d=10.0*d+double(ch-'0'); ch=ex[++t]; } if(ch=='.') //判断是否为小数 { ch=ex[++t]; double k=1.0; while(ch>='0'&&ch;<='9') { d=d+double(ch-'0')/(10.0*k); k=k+1.0; ch=ex[++t]; } } top++; _stack[top]=d; } else { _stack[top-1]=_stack[top-1]+_stack[top]; top--; t++; } break; case '-': if(flag[t]) //'-'表示负号 { ch=ex[++t]; double d=0; while(ch>='0'&&ch;<='9') { d=10.0*d+double(ch-'0'); ch=ex[++t]; } if(ch=='.') { ch=ex[++t]; double k=1.0; while(ch>='0'&&ch;<='9') { d=d+double(ch-'0')/(10.0*k); k=k+1.0; ch=ex[++t]; } } top++; _stack[top]=-d; } else { _stack[top-1]=_stack[top-1]-_stack[top]; top--; t++; } break; case '^': //运算符为'^' if(_stack[top]==0) { _stack[top-1]=1; } else { int temp; temp=_stack[top-1]; while(--_stack[top]) { _stack[top-1]*=temp; } } top--; t++; break; case '*': _stack[top-1]=_stack[top-1]*_stack[top]; top--; t++; break; case '/': if(_stack[top]!=0) _stack[top-1]=_stack[top-1]/_stack[top]; else { printf("\n\tchu0error!\n"); exit(0); } top--; t++; break; default: double d=0; while(ch>='0'&&ch;<='9') { d=10.0*d+double(ch-'0'); ch=ex[++t]; } if(ch=='.') //判断是否为小数 { ch=ex[++t]; double k=1.0; while(ch>='0'&&ch;<='9') { d=d+double(ch-'0')/(10.0*k); k=k+1.0; ch=ex[++t]; } } top++; _stack[top]=d; } ch=ex[t]; } cout<<"计算出的结果:"<<_stack[top]<


网友评论