5-20 表达式转换

来源:互联网 发布:区块链闪电网络 知乎 编辑:程序博客网 时间:2024/04/27 13:30

算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。

输入格式:

输入在一行中给出不含空格的中缀表达式,可包含+-*\以及左右括号(),表达式不超过20个字符。

输出格式:

在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。

输入样例:

2+3*(7-4)+8/4

输出样例:

2 3 7 4 - * + 8 4 / +

思路点:关键在于 '('直接进栈,‘)’直接出栈(结果不含括号),只有优先级大于栈顶才入栈,其他情况出栈(注意同符号也要出栈,符号优先级相同按从左到右出栈)。

数据结构:容器头尾作为两个栈。

问题:PTA官网无法编译通过,但VS,VC6都能成功,不知原因。


#include<iostream>#include<vector>#include<string>#define lyft vector<string>&using namespace std;int testcomlyf(char or, char right);void insert(lyft ve,char a, int &l, int &r, int &pr){if (0 <= a - '0'&&a - '0' <= 9)//数字{if (l == 0){ve[l++] = a;pr = 1;}else{if (pr){ve[l - 1] = ve[l - 1].append(1, a);}else{//判断优先级ve[l++] = a;pr = 1;}}}else//符号{pr = 0;if (r ==( ve.size() - 1)){ve[r--] = a;}else{//判断优先级//判断优先级switch (0){case 0:r++; break;case 1:ve[r--] = a; break;case -1:{   ve[l++] = ve[++r];   insert(ve, a, l, r, pr);}}}}}int testcomlyf(char or, char right){char test = or;switch (test){case '(':if (right == ')')return 0;//表示清除else{return 1;//大于}case'+':if (right == '*' || right == '/' || right == '(')return 1;else return -1;case'-':if (right == '*' || right == '/' || right == '(')return 1;else return -1;case'*':if (right == '(')return 1;else return -1;case'/':if (right == '(')return 1;else return -1;default:return 0;}return 0;}int main(){string p = "";int N, M, left = 0, right = 0, preisnum = 0;cin >> p;vector<string> ve(40);right = ve.size() - 1;for (int i = 0; i < p.size(); i++){insert(ve, p[i], left, right, preisnum);}if (right != ve.size() - 1){while (right != ve.size() - 1){ve[left++] = ve[++right];}}for (int j = 0; j < left; j++)cout << " " << ve[j];system("pause");return 0;}


0 0
原创粉丝点击