任务描述
本关任务:熟练掌握STL模板库中栈stack的基本操作,并利用栈实现中缀表达式转化为后缀表达式。
相关知识
中缀表达式转后缀表达式算法:。 (1) 初始化一个字符栈S和一个字符队列Q(存最终的后缀表达式) (2) 从左至右扫描中缀表达式; (3) 遇到操作数时,加入队列Q; (4) 遇到括号时: (4-1) 如果是左括号(,则直接压入S; (4-2) 如果是右括号),则依次弹出S栈顶的运算符,加入队列Q,直到遇到左括号为止,此时将这一对括号丢弃; (5) 遇到运算符时,比较其与S栈顶运算符的优先级: (5-1) 如果S为空,或栈顶运算符为左括号(,则直接将此运算符入栈; (5-2) 否则,若优先级比栈顶运算符的高,也将运算符压入S (5-3) 否则,将S栈顶的运算符弹出并入队列Q中,再次转到(4-1)与S中新的栈顶运算符相比较; (6) 重复步骤(2)至(5),直到表达式的最右边; (7) 将栈S中剩余的运算符依次弹出并加入队列S; (8) 依次输出队列Q中的元素并输出,即为后缀表达式。 例如,将中缀表达式2*(1+3)-4
转换为后缀表达式2 1 3 + * 4 -
的过程如下:
编程要求
本关的编程任务是补全右侧代码片段main中Begin至End中间的代码,具体要求如下:
读取中缀表达式,并基于栈的插入、删除等基本操作实现中缀表达式转化为后缀表达式。 说明: (1)表达式中所有的操作数为单一的数字:0~9; (2)运算符仅包含:+ - * /( ),其中“-”仅为减号,非负号; (3)表达式符号串的长度不超过100。
测试说明
平台将自动编译补全后的代码,并生成若干组测试数据,接着根据程序的输出判断程序是否正确。
以下是平台的测试样例:
测试输入:1+((2+3)*4)-5
预期输出:123+4*+5-
输入格式:中缀表达式 输出格式:后缀表达式,末尾换行
#include<iostream> #include<stack> #include<queue> #include<string.h> using namespace std; void intopost(char inexp[], char postexp[]);//把中缀表达式inexp,转换为后缀表达式postexp int getPriority(char left, char right);//优先级比较(注意当运算符较多,优先级等级较多时,可以使用优先级表,并进行查表的方式进行比较) int isNum(char ch);//判断是否为数字字符 stack<char>s1; stack<char>s2; int f(const char str){ int yxj; switch(str){ case '*':yxj=5;break; case '/':yxj=5;break; case '+':yxj=4;break; case '-':yxj=4;break; } return yxj; } int main() { char c[100], postexp[100]; cin >> c; //intopost(inexp, postexp); //转换中缀表达式为后缀表达式 //cout << postexp<<endl; int lenc=strlen(c); for(int i=0;i<lenc;i++){ if(c[i]>='0'&&c[i]<='9'){ s2.push(c[i]); }else if(c[i]=='+'||c[i]=='-'||c[i]=='*'||c[i]=='/'){ while(1){ if(s1.empty()||s1.top()=='('){ s1.push(c[i]); break; } else if(f(c[i])>f(s1.top())){ s1.push(c[i]); break; } else{ char cc=s1.top(); s1.pop(); s2.push(cc); } } } else{ if(c[i]=='('){ s1.push(c[i]); }else{ while(s1.top()!='('){ char ccc=s1.top(); s1.pop(); s2.push(ccc); } s1.pop(); } } } while(!s1.empty()){ char cccc=s1.top(); s2.push(cccc); s1.pop(); } while(!s2.empty()){ char c=s2.top(); s1.push(c); s2.pop(); } while(!s1.empty()){ cout<<s1.top(); s1.pop(); } return 0; } void intopost(char inexp[], char postexp[]) { // 请在这里补充代码,完成本关任务 /********** Begin *********/ /********** End **********/ } int isNum(char ch) { // 请在这里补充代码,完成本关任务 /********** Begin *********/ /********** End **********/ } //优先级比较(注意当运算符较多,优先级等级较多时,可以使用优先级表,并进行查表的方式进行比较) int getPriority(char left, char right) { // 请在这里补充代码,完成本关任务 /********** Begin *********/ /********** End **********/ }