算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。
输入格式:
输入在一行中给出不含空格的中缀表达式,可包含+
、-
、*
、\
以及左右括号()
,表达式不超过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;
}