数据结构实验之栈与队列二:一般算术表达式转换成后缀式
2017-09-28 23:02
323 查看
数据结构实验之栈与队列二:一般算术表达式转换成后缀式
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 0 typedef 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; }
相关文章推荐
- 数据结构实验之栈与队列二:一般算术表达式转换成后缀式
- 数据结构实验之栈与队列二:一般算术表达式转换成后缀式
- 数据结构实验之栈与队列二:一般算术表达式转换成后缀式
- 数据结构实验之栈与队列二:一般算术表达式转换成后缀式
- 数据结构实验之栈与队列二:一般算术表达式转换成后缀式
- 数据结构实验之栈与队列二:一般算术表达式转换成后缀式
- 数据结构实验之栈与队列二:一般算术表达式转换成后缀式
- 数据结构实验之栈与队列二:一般算术表达式转换成后缀式
- 数据结构实验之栈与队列二:一般算术表达式转换成后缀式
- 数据结构实验之栈与队列二:一般算术表达式转换成后缀式---2132
- 数据结构实验之栈与队列二:一般算术表达式转换成后缀式oj
- 数据结构实验之栈与队列二:一般算术表达式转换成后缀式
- 数据结构实验之栈与队列二:一般算术表达式转换成后缀式 sdut-oj
- 数据结构实验之栈与队列二:一般算术表达式转换成后缀式
- 数据结构实验之栈与队列二:一般算术表达式转换成后缀式
- 数据结构实验之栈与队列二:一般算术表达式转换成后缀式
- 寒假第三天--栈和队列--数据结构实验之栈二:一般算术表达式转换成后缀式
- 数据结构实验之栈二:一般算术表达式转换成后缀式
- 数据结构实验之栈二:一般算术表达式转换成后缀式
- 数据结构实验之栈二:一般算术表达式转换成后缀式(栈)