栈的应用:求中缀表达式的值。
来源:互联网 发布:网络实名制利大于弊 编辑:程序博客网 时间:2024/05/22 10:26
栈的应用:求中缀表达式的值。
数据结构实训,数据结构课本上关于这个有一个标准伪码,没看过。
这个算法以前做题的时候遇到过,这次测试的时候很幸运的发现了在之前实现过程中一个没有理解到位的地方,比如遇到某个符号,符号栈中的符号满足可以进行运算处理的要求,这个时候不是处理一次,而是一直要处理到符号栈不满足要求为止。这样最终处理结果符号栈中最多剩下两个符号,再依次处理即可。
细节+代码如下:
#include<stdio.h>#include<string.h> #include<stdlib.h> #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 int n,n1,n2;typedef struct express{ int num; char op; }express; typedef struct sqstack{ //栈的结构。 express *base; express *top; int stacksize; }sqstack; int initstack(sqstack *S){ //构建一个栈。 S->base = (express *)malloc(STACK_INIT_SIZE*sizeof(express)); S->top = (express *)malloc(STACK_INIT_SIZE*sizeof(express)); if(!S->base||!S->top) return -1; S->top = S->base; S->stacksize = STACK_INIT_SIZE; return 1; } int pushchar(sqstack *S,char e){ //字符栈的入栈函数。 if(S->top-S->base>=S->stacksize){ S->base = (express *)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(express)); if(!S->base) return 0; S->top = S->base+S->stacksize; S->stacksize = S->stacksize+STACKINCREMENT; } (S->top)->op= e; S->top++; return 1; } int pushint(sqstack *S,int e){ //数字栈的入栈函数。 if(S->top-S->base>=S->stacksize){ S->base = (express *)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(express)); if(!S->base) return 0; S->top = S->base+S->stacksize; S->stacksize = S->stacksize+STACKINCREMENT; } (S->top)->num= e; S->top++; return 1; } int popchar(sqstack *S,char *g){ //字符栈的出栈函数。 if(S->top==S->base) return -1; S->top--; *g = S->top->op; return 0; } int popint(sqstack *S,int *g){ //数字栈的出栈函数。 if(S->top==S->base) return -1; S->top--; *g = (S->top)->num; return 0; } int count(int k1,int k2,char t){ //运算操作函数。 int enter; if(t=='+') enter = k1+k2; if(t=='-') enter = k2-k1; if(t=='*') enter = k1*k2; if(t=='/') enter = k2/k1; return enter; } int empty(sqstack *S,int n){ //判断栈在当前的空值定义下是否为空。 if(S->top - S->base==n) return 0; else return 1; } int main(){ sqstack S1,S2; char a[100],t; int m,i,number,k1,k2,k3; n1 = 0;n2 = 0; initstack(&S1); initstack(&S2); scanf("%s",a); m = strlen(a)-1; for(i = 0;i<=m;i++){ if(a[i]>='0'&&a[i]<='9'){ //遇到数字的处理。 number = a[i]-'0'; pushint(&S1,number); continue; } if(a[i]=='+'||a[i]=='-'){ //遇到"+"或"-"的处理。 if(empty(&S2,n2)==0){ pushchar(&S2,a[i]);continue; } while(empty(&S2,n2)==1){ popint(&S1,&k1); popint(&S1,&k2); popchar(&S2,&t); k3 = count(k1,k2,t); pushint(&S1,k3); } pushchar(&S2,a[i]); } if(a[i]=='*'||a[i]=='/'){ //遇到"*"或"/"的处理。 if(empty(&S2,n2)==0){ pushchar(&S2,a[i]);continue; } while(empty(&S2,n2)==1){popchar(&S2,&t); if(t=='+'||t=='-'){ pushchar(&S2,t);break;} if(t=='*'||t=='/'){ popint(&S1,&k1); popint(&S1,&k2); k3 = count(k1,k2,t); pushint(&S1,k3); } } pushchar(&S2,a[i]); }if(a[i]=='('){ //改变当前空值对应的取值。n1 = S1.top - S1.base;n2 = S2.top - S2.base;}if(a[i]==')'){ //对括号中剩余运算的处理。while(S1.top-S1.base>n1+1){popint(&S1,&k1); popint(&S1,&k2); popchar(&S2,&t); k3 = count(k1,k2,t); pushint(&S1,k3); }n1 = 0;n2 = 0;} }while(S1.top-S1.base>1){ //对计算结果的最后运算处理。popint(&S1,&k1); popint(&S1,&k2); popchar(&S2,&t); k3 = count(k1,k2,t); pushint(&S1,k3); }printf("%d\n",k3); return 0; }/* 测试案例: * * 输入: * 4*4+(2*2-3)-3 * 输出: * 14 */
0 0
- 栈的应用:求中缀表达式的值。
- 栈的应用—中缀转后缀求表达式值
- [栈]求中缀表达式的值
- 求中缀表达式的值
- 中缀表达式转后缀表达式_求表达式的值
- 栈的应用-中缀表达式求值
- 栈的应用实例---中缀表达式求值
- 栈的应用之中缀表达式求值
- 直接利用中缀表达式求算术表达式的值(C#)
- 中缀表达式的值
- 中缀表达式的值
- 中缀表达式的值
- 栈的应用--后缀表达式和中缀表达式的实现
- 栈的应用:后缀表达式到中缀表达式的转换
- 中缀表达式转后缀表达式求值(栈的应用)
- 栈的应用-中缀表达式转后缀表达式(C版)
- 中缀表达式转化为后缀表达式(栈的应用)
- 栈的应用实践之中缀表达式转后缀表达式
- 处事心得
- 【数学基础】多个数的最大公约数
- sgu 153 Playing with matches DP+枚举循环节
- mac 下配置mysql
- Codeforces 380D Sereja and Cinema
- 栈的应用:求中缀表达式的值。
- 编程思考[1]--递归和迭代再思考
- iOS Dev (27) 初步了解下UIView的最常用知识
- 数据结构上机测试1:顺序表的应用
- Lua 类型与值(二)
- 约瑟夫问题
- JAVA hdu 2539 点球大战
- 瑞莱观点:地图为何会是巨头们的战略级产品?
- 使用 Karma 和 Jasmine 测试 AngularJs