#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #define MAXzhansize 30 char stack[MAXzhansize];// char deleted(int *top); void add(int *top,char item); ////////////////////////////////////////////////////////////////////////////////// ////////////逆波兰数计算 #define element int #define ni_MAXzhansize 20 /////////////+ - * / % out 数字 typedef enum{jia,jian,cheng,chu,yu,eos,shuzi}prece; int ni_stack[ni_MAXzhansize]; void nisuanadd(int *top,element item); element nisuandeleted(int *p); int eval(); prece gettoken(char*symbol,int *n); //////////////////////////////////////////////////////////////////////////// char c[30];////结果字符 void main() { int a[128]; a[‘+‘]=1;///预备优先级 a[‘-‘]=1; a[‘*‘]=2; a[‘/‘]=2; a[‘%‘]=2; a[‘(‘]=0; a[‘)‘]=0; a[‘,‘]=-1; int top=-1,j=0;//top始终是指向栈顶元素的 char b[30];/////原始字符 gets(b);//(2+3*4+5)*(2+3) add(&top,‘,‘);// 最低优先级a[‘,‘]=-1; for(int i=0;b[i]!=‘\0‘;++i) { if(!isdigit( b[i]) )///不是数字符号时,若是数字就直接增加数组c中 { if(b[i] == ‘(‘ )//前两个if语句 处理特殊情况 一对括号 { add( &top, b[i] );//直接加到栈里‘(‘ continue; } if(b[i] == ‘)‘ )//处理一对括号 { while( stack[top] != ‘(‘ )//输出符号 { c[j++]=deleted(&top); printf("%c",c[j-1]); } deleted(&top);//除掉一个‘(‘ continue; } if(a[ b[i] ] > a[ stack[top] ]) ////当前的符号优先级大于栈顶的符号是放入,,否则弹出栈顶.......... { add( &top, b[i] ); continue; } else { while(a[ b[i] ] <= a[ stack[top] ])/////输出符号直到大于栈顶符号的优先级 { c[j++]=deleted(&top); printf("%c",c[j-1]); } add( &top, b[i] );//把当前的符号加进去 continue; } } else////是数字符号时 { c[j++]=b[i]; printf("%c",c[j-1]); } } while(top !=0 )/////栈里剩余的符号输出 { c[j++]=deleted(&top); printf("%c",c[j-1]); } c[j++]=‘ ‘;//这个空位用于终止 c[j++]=‘\0‘;////补上空字符 printf(" "); puts(c); printf("\n%d",eval()); } void add(int *top,char item) { if(*top>=MAXzhansize) { printf("jj\n"); exit(1); } stack[++*top]=item; } char deleted(int *top) { if(*top==-1) { printf("kkkkkkkkkkkkkk\n"); exit(1); } return stack[(*top)--]; } //////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////逆波兰数计算 int eval() { prece token;//符号或数字 char symbol; int shu1,shu2; int n=0; int top=-1; token=gettoken(&symbol,&n); while(token!=eos)//不到尾部 { if(token==shuzi) nisuanadd(&top,symbol-‘0‘);//是数字就加进去 else {///////////////////////否则调用两个数据与符号操作后,再加进去 shu2=nisuandeleted(&top); shu1=nisuandeleted(&top); switch(token) { case jia:nisuanadd(&top,shu1+shu2);break; case jian:nisuanadd(&top,shu1-shu2);break; case cheng:nisuanadd(&top,shu1*shu2);break; case chu:nisuanadd(&top,shu1/shu2);break; case yu:nisuanadd(&top,shu1%shu2);break; } } token=gettoken(&symbol,&n);//下一个 } return nisuandeleted(&top); } prece gettoken(char*symbol,int *n) { *symbol=c[(*n)++];//下一个字符 switch(*symbol) { case‘+‘:return jia; case‘-‘:return jian; case‘*‘:return cheng; case‘/‘:return chu; case‘%‘:return yu; case‘ ‘:return eos; default:return shuzi; } } void nisuanadd(int *top,int item) { if(*top>=MAXzhansize) { printf("jjjjjj\n"); exit(1); } ni_stack[++*top]=item; } int nisuandeleted(int *top) { if(*top==-1) { printf("kkkkkkk\n"); exit(1); } return ni_stack[(*top)--]; } //////////////////////////////////////////////////////////////////////////////////////////
时间: 2024-12-15 15:37:22