数据结构实验之栈二:一般算术表达式转换成后缀式
2016-07-02 10:01
411 查看
数据结构实验之栈二:一般算术表达式转换成后缀式
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。
输入
输入一个算术表达式,以‘#’字符作为结束标志。
输出
输出该表达式转换所得到的后缀式。
示例输入
a*b+(c-d/e)*f#
示例输出
ab*cde/-f*+
提示
#include<iostream> #include<cstdlib> #include<string> #define STACK_INIT_SIZE 100//存储空间初始分配量 #define STACKINCREMENT 10//存储空间分配增量 using namespace std; typedef struct { char *base; char *top; int stacksize; }SqStack; SqStack S; int InitStack(SqStack &S)//构造一个空栈 { S.base=(char *)malloc(STACK_INIT_SIZE*sizeof(char )); if(!S.base) exit(0); S.top=S.base; S.stacksize = STACK_INIT_SIZE; return 1; } char GetTop(SqStack S,char &e)//获取栈顶元素 { if(S.top==S.base) return 0; e=*(S.top-1); return 1; } int Push(SqStack &S,char e)////压栈,插入元素e为新的栈顶元素 { if(S.top-S.base>=S.stacksize)//栈满,追加存储空间 { S.base=(char *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(char )); if(!S.base) exit(0); S.top=S.base+S.stacksize; S.stacksize+=STACKINCREMENT; } *S.top++=e; return 1; } int Pop(SqStack &S,char &e)//出栈 { if(S.top==S.base) return 0; e=*(S.top--); return 1; } int StackEmpty(SqStack S)//判空 { if(S.top==S.base) return true; else return false; } int youxian(char c)//符号优先级判断 { if(c=='+'||c=='-') return 1; if(c=='*'||c=='/') return 2; if(c=='(') return 3; if(c==')') return 4; } int main() { char etop,epop; string str; cin>>str; int i=0; while(str[i]!='#') { if(str[i]>='a'&&str[i]<='z'){ cout<<str[i]; //如果不是符号直接输出 } else { if(StackEmpty(S)) Push(S,str[i]);//如果栈为空,符号直接进栈 else//否则判断要进入的元素和栈顶元素的优先级 { GetTop(S,etop); if(youxian(str[i])>=youxian(etop))//如果优先级高于栈顶元素 { if(youxian(str[i])==4)//如果为‘)’,则将‘(’右边的元素出栈 { GetTop(S,etop); while(etop!='(') { cout<<etop; Pop(S,epop); GetTop(S,etop); } Pop(S,epop);//删除‘(’ } else//若不是‘)’,则进栈 { Push(S,str[i]); } } else//如果优先级低于栈顶元素 { if(etop!='(')//判断栈顶元素是否为‘(’,如果不是栈顶元素出栈,当前元素进栈 { Pop(S,epop); cout<<etop; Push(S,str[i]); } else//是‘(’进栈 { Push(S,str[i]); } } } } i++; } GetTop(S,etop); while(!StackEmpty(S))//将栈中元素出栈 { cout<<etop; Pop(S,epop); GetTop(S,etop); } cout<<endl; return 0; }
相关文章推荐
- 螺旋矩阵
- 数据结构实验之栈二:一般算术表达式转换成后缀式
- 数据结构-线性表
- 数据结构 树 相关面试试题
- 自定义数据结构的基于范围的for循环 range-based for loop
- 数据结构和算法 – 12.高级查找算法(下)
- 最短路径算法
- 【数据结构】平衡搜索树之---B树的算法实现
- 数据结构实验之链表一:顺序建立链表
- java数据结构-HashMap
- Redis(2)- 基本数据结构和操作
- Python内置数据结构与操作符的练习题集锦
- HDU 5289 RMQ+尺取
- 剑指offer(二.2)数据结构之数组2 面试题3
- 数据结构之【排序】--复习
- 海量数据处理-数据结构
- linux设备树的解释 - DT文件数据结构
- 《数据结构》复习之稀疏矩阵(矩阵转置)
- 数据结构与算法简记:快速排序
- 数据结构也不是那么没意思之前序二叉树+二叉树转伪双向循环链表