栈的应用-表达式求值-数据结构
来源:互联网 发布:高会军 争议 知乎 编辑:程序博客网 时间:2024/06/07 12:59
栈的应用之一,表达式求值,严慧敏书上给的例子是只有1位数的输入,这里稍微改下,处理下多位数的+、-、*、/。
表达式要求输入合法,且除数要能整除,不然就int掉,算出来错了,主要就是书中优先级表的应用。
省去那些STATUS的返回,什么ERROR OK OVERFLOW 的。
完整代码:
#include<stdio.h>#include<string.h>#include<malloc.h>#define InitStackSize 100#define Increase 100typedef struct SqcharStack{char *base,*top;int stacksize;}SqcharStack;typedef struct SqintStack{int *base,*top;int stacksize;}SqintStack;void InitcharStack(SqcharStack &s){s.base=s.top=(char*)malloc(InitStackSize*sizeof(char));s.stacksize=InitStackSize;}void InitintStack(SqintStack &s){s.base=s.top=(int*)malloc(InitStackSize*sizeof(int));s.stacksize=InitStackSize;} void PushcharStack(SqcharStack &s,char key) //字符栈 {if(s.top-s.base>=s.stacksize){s.base=(char*)realloc(s.base,(s.stacksize+Increase)*sizeof(char));s.top=s.base+s.stacksize;s.stacksize+=Increase;}*s.top=key;s.top++;}void PushintStack(SqintStack &s,int key) //数字栈 {if(s.top-s.base>=s.stacksize){s.base=(int*)realloc(s.base,(Increase+s.stacksize)*sizeof(int));s.top=s.base+s.stacksize;s.stacksize+=Increase;}*s.top=key;s.top++;}char GetcharStackTop(SqcharStack S){char e;e=*--S.top;return e;}int GetintStackTop(SqintStack S){int e;e=*--S.top;return e;}int In(char a,char sym[]){int i;for(i=0;i<7;i++)if(sym[i]==a) return 1;return 0;}void PopcharStack(SqcharStack &s){s.top--;}void PopintStack(SqintStack &s){s.top--;}char Precede(char a,char b,char pr[][10]) //判断优先级 {int i,j;switch(a){case '+':i=0;break;case '-':i=1;break;case '*':i=2;break;case '/':i=3;break;case '(':i=4;break;case ')':i=5;break;case '=':i=6;break;default:break;}switch(b){case '+':j=0;break;case '-':j=1;break;case '*':j=2;break;case '/':j=3;break;case '(':j=4;break;case ')':j=5;break;case '=':j=6;break;default:break;}return pr[i][j];}int Operate(int a,int b,char ch){switch(ch){case '+':return b+a;break;case '-':return b-a;break;case '*':return b*a;break;case '/':return b/a;break;default:break;}}int main(){SqcharStack OPTR;SqintStack OPND;char str[101];int i,k,j,byt,num,temp,len;int a,b; char theta;char pre[][10]={{'>','>','<','<','<','>','>'},{'>','>','<','<','<','>','>'},{'>','>','>','>','<','>','>'},{'>','>','>','>','<','>','>'},{'<','<','<','<','<','=','0'},{'>','>','>','>','0','>','>'},{'<','<','<','<','<','0','='}}; //优先级表 char OP[]={'+','-','*','/','(',')','='}; //操作符集合 InitcharStack(OPTR);InitintStack(OPND);memset(str,'\0',sizeof(str));while(gets(str)){PushcharStack(OPTR,'=');len=strlen(str);i=0;while(i<len){if(str[i]==' ') {i++;continue;}if(!In(str[i],OP)) //如果不是操作符,读入数字 {SqcharStack Num;InitcharStack(Num);byt=0; //数字位数 //读入数字字符for(j=i;!In(str[j],OP) && str[j]!=' ' && str[j]!='\0' && str[j]!='=';j++){PushcharStack(Num,str[j]);byt++;}num=0;//生成数字 temp=1;while(byt--){k=(GetcharStackTop(Num)-'0');num+=temp*k;temp*=10;PopcharStack(Num);}PushintStack(OPND,num);//while 生成数字i=j; //i位置跳过数字}//if 是数字 else//操作符 {switch(Precede(GetcharStackTop(OPTR),str[i],pre)){case '<':PushcharStack(OPTR,str[i]);i++;break; //栈顶元素优先权低 case '=':PopcharStack(OPTR);i++;break;//脱括号 case '>':theta=GetcharStackTop(OPTR); //取得栈中运算符 PopcharStack(OPTR);a=GetintStackTop(OPND);PopintStack(OPND);b=GetintStackTop(OPND);PopintStack(OPND);PushintStack(OPND,Operate(a,b,theta)); //这里注意a,b顺序,反了的话减和除运算就错了 break;}} }//while( || )printf("The result is:%d\n",GetintStackTop(OPND));}return 0;}/*123+456=4+5*6-10=(2+8)*6/5=100/2/2/5= */
0 0
- 数据结构 栈的应用-- 表达式求值
- 【数据结构】栈的应用 I :表达式求值
- 栈的应用-表达式求值-数据结构
- 表达式求值(数据结构-栈的应用 )
- 表达式求值 数据结构 C/C++ 栈的应用
- 回顾数据结构之栈的应用-表达式求值
- 表达式求值(数据结构书上栈的应用之一)
- 数据结构 - 栈的应用:表达式求值(C)
- 数据结构之栈的应用——四则表达式求值
- 数据结构(6)--栈的应用之中缀表达式求值
- 常用数据结构栈的应用—-表达式求值
- [数据结构与算法] 5,栈的应用-四则运算表达式求值
- 数据结构 栈的应用——算术表达式求值
- 【数据结构】实验二:栈与队列的应用---表达式求值
- 栈的应用 表达式求值
- 表达式求值【栈的应用】
- 栈的应用表达式求值
- 栈的应用-表达式求值
- [Leetcode]Single Number II
- svn下本地工程在服务器上的url以及信息
- android shape的使用
- Sublime Text 2 支持GB2312和GBK
- 硬链接 and 软链接
- 栈的应用-表达式求值-数据结构
- java.util.concurrent之CountDownLatch
- 无锁编程(二) - 原子操作
- Debian/Ubuntu下安装GeoIP
- Android View的ScrollBar
- 眉目传情之匠心独运的kfifo
- POJ 3321 Apple Tree(dfs序 + 树状数组)
- 垃圾邮件两大威胁:巨集病毒和勒索软件
- C++面试常见问题