数据结构实验之栈与队列二:一般算术表达式转换成后缀式
来源:互联网 发布:联合网络图书采访 编辑:程序博客网 时间:2024/06/08 19:35
数据结构实验之栈与队列二:一般算术表达式转换成后缀式
Problem Description
对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。
Input
输入一个算术表达式,以‘#’字符作为结束标志。
Output
输出该表达式转换所得到的后缀式。 //后缀表达式每一项的操作符均在后面
Example Input
a*b+(c-d/e)*f#
Example Output
ab*cde/-f*+
思路:遇到数值直接存入表达式。遇到操作符做判断。1.遇到右括号,把在栈里的操作符都出栈,直到遇到左括号。2.每次读到一个操作符,都要与栈顶元素做判断。如果此优先级大于栈顶元素优先级,直接push。如果小于,将栈顶元素pop,直到此优先级大于下一个(下一个,下一个)栈顶元素,再push。3.最后如果栈非空,依次pop。存入表达式数组exp【1000】。
#include <stdio.h>#include <stdlib.h>#include <string.h>#define stackmax 100000#define stacknum 100#define OK 1#define ERROR 0#define OVERFLOW -2#define TRUE 1#define FALSE 0typedef int status;typedef char selemtype;typedef struct{ selemtype *base; selemtype *top; int stacksize;} sqstack;int inistack(sqstack &S){ S.base=new selemtype[stackmax]; if(!S.base) exit(OVERFLOW); S.top=S.base; S.stacksize=stackmax; return OK;}int push(sqstack &S, selemtype e){ if(S.top-S.base>=S.stacksize) { S.base=(selemtype *)realloc(S.base,(S.stacksize+stacknum)*sizeof(selemtype)); if(!S.base) exit(OVERFLOW); S.top=S.base+S.stacksize; S.stacksize+=stacknum; } *S.top=e; S.top++; return 0;}int pop(sqstack &S, selemtype &e){ if(S.base==S.top) return ERROR; else e=*--S.top; return OK;}status isempty(sqstack S){ if(S.base==S.top) return TRUE; else return FALSE;}int compare(char a)//运算符返回值{ if(a=='+'||a=='-') return 1; else if(a=='*'||a=='/') return 2; else if(a=='(') return 3; else if(a==')') return 4;}int main(){ sqstack S; inistack(S); char exp[10000];//存后缀式 char a[10000];//存输入的字符,并没有用 int i=0,num=0;//i=0初始化! selemtype e; while(~scanf("%c",&a[i])&&a[i]!='#')//边输入字符边判断 { if(a[i]>='a'&&a[i]<='z'||a[i]>='A'&&a[i]<='Z') { exp[num++]=a[i]; } else { if(isempty(S))//如果是空栈,直接进栈 { push(S,a[i]); } else if(compare(a[i])>compare(*(S.top-1)))//优先级大或者是括号。但此刻考虑左括号没有意义 { if(a[i]==')')//括号不进栈.不参与后缀式的构成 { while(*(S.top-1)!='(') { exp[num++]=*(S.top-1); pop(S,e); } pop(S,e);//将左括号pop走 } else push(S,a[i]); } else//优先级小比栈顶元素小 { if(*(S.top-1)=='(') { push(S,a[i]); } else { exp[num++]=*(S.top-1); pop(S,e); push(S,a[i]); } } } } while(!isempty(S))//非空栈时,将元素全弹出,并赋值于exp[] { exp[num++]=*(S.top-1); pop(S,e); } for(int i=0;i<strlen(exp);i++) { printf("%c",exp[i]); } printf("\n"); return 0;}
阅读全文
0 0
- 数据结构实验之栈与队列二:一般算术表达式转换成后缀式
- 数据结构实验之栈与队列二:一般算术表达式转换成后缀式
- 数据结构实验之栈与队列二:一般算术表达式转换成后缀式
- 数据结构实验之栈与队列二:一般算术表达式转换成后缀式
- 数据结构实验之栈与队列二:一般算术表达式转换成后缀式
- 数据结构实验之栈与队列二:一般算术表达式转换成后缀式
- 数据结构实验之栈与队列二:一般算术表达式转换成后缀式 sdut-oj
- 数据结构实验之栈与队列二:一般算术表达式转换成后缀式
- 数据结构实验之栈与队列二:一般算术表达式转换成后缀式
- 数据结构实验之栈与队列二:一般算术表达式转换成后缀式
- 2132 数据结构实验之栈与队列二:一般算术表达式转换成后缀式
- 数据结构实验之栈与队列二:一般算术表达式转换成后缀式
- 数据结构实验之栈与队列二:一般算术表达式转换成后缀式
- 数据结构实验之栈与队列二:一般算术表达式转换成后缀式
- 2132-数据结构实验之栈与队列二:一般算术表达式转换成后缀式
- 数据结构实验之栈与队列二:一般算术表达式转换成后缀式
- 数据结构实验之栈与队列二:一般算术表达式转换成后缀式
- 数据结构实验之栈与队列二:一般算术表达式转换成后缀式
- Linux中vim常用快捷键
- spring各个jar包的作用及功能总结
- VMware12提示 已将该虚拟机配置为使用 64 位客户机操作系统。但是,无法执行 64 位操作
- Java学习路上的对一些书籍的推荐
- 脑科学对“天才”的科学分析——新书《无为》解读
- 数据结构实验之栈与队列二:一般算术表达式转换成后缀式
- apache网址示例
- 【C语言】【unix c】可重入函数
- HDU 3529 Bomberman
- UE4 让物理体拥有速度 (不使用Projectile Movement)
- 数据库
- OkHttp3向服务器同步提交各种数据的写法
- 开始之旅
- 9月28