算術表達式
阿新 • • 發佈:2017-06-07
clas ont 數據 ctype -- ++i main track efault
#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)--]; } //////////////////////////////////////////////////////////////////////////////////////////
算術表達式