问题遇到的现象和发生背景
用代码块功能插入代码,请勿粘贴截图
我想要达到的结果
DS栈—波兰式,逆波兰式 这样对吗?
#include
#include
using namespace std;
int panduan(char a)
{
switch (a)
{
case'#':
case'&':
return -1;//终止运算符
case'+':
case'-':
return 1;//一级运算符
case'*':
case'/':
return 2;//2级运算符
case'(':
case')':
return 3;//3级
default:
return 0;//数字
}
}
void sun(stack s)
{
string temple="?";
string s1[20];//数字 运算符
stack s2;//运算符
int t = 0;
while (!s.empty())
{
int flage = panduan(s.top());
if (flage == 0)//数字
{
s1[t] = (s.top());//存在左边
s.pop();
if (panduan(s.top()) == 0)//下一个为数字
{
s1[t] = s1[t] + s.top();
s.pop();
t++;
}
else
{
t++;
}
}
else if (flage == 1)//一级运算符+-
{
if (s2.empty())
{
s2.push(s.top());
s.pop();
}
else if (s2.top() == '*' || s2.top() == '/'|| s2.top() == '+' || s2.top() == '-')//前一个数上级的 或同级
{
t--; t--;
s1[t] = s2.top() + temple + s1[t] + temple + s1[t + 1];//将运算符穿起来
s2.pop();
t++;
s1[t] = ' ';
}
else
{
s2.push(s.top());//压入s2的值
s.pop();
}
}
else if (flage == 2)//二级运算符*/
{
if (s2.top() == '-' || s2.top() == '+'|| s2.top()=='('||s2.empty())//前一个数下级的 或空
{
s2.push(s.top()); s.pop();
}
else if (s2.top() == '*' || s2.top() == '/')
{
t--; t--;
s1[t] = s2.top() + temple + s1[t] + temple + s1[t + 1];//将运算符穿起来
s2.pop();
s1[t++] = ' ';
//s2.push(s.top());//压入s2的值
}
}
else if (flage == 3)//3运算符 )
{
if (s.top() == ')')
{
if (s2.top() == '+' || s2.top() == '-'||s2.top() == '*' || s2.top() == '/')
{
t--; t--;
s1[t] = s2.top() + temple + s1[t] + temple + s1[t + 1];//将运算符穿起来
s2.pop();
s1[++t] = ' ';
//s2.push(s.top());//压入s2的值
}
else if (s2.top() == '(')
{
s2.pop(); s.pop();
}
}
else
{
if(s.top() == '(')
{
s2.push(s.top()); s.pop();
}
}
}
else if (flage==-1)
{
t--; t--;
s1[t] = s2.top() + temple + s1[t] + temple + s1[t + 1];//将运算符穿起来
s2.pop();
s1[++t] = ' ';
s.pop();
}
}
string a = s1[0];
int longt = a.length();
for (int i=0; i < longt; i++)
{
if (a[i]=='?')
{
cout << ' ';
}
else
{
cout << a[i];
}
}
}
void xia(stack s)
{
string temple = "?";
string s1[20];//数字 运算符
stack s2;//运算符
int t = 0;
while (!s.empty())
{
int flage = panduan(s.top());
if (flage == 0)//数字
{
s1[t] = (s.top());//存在左边
s.pop();
if (panduan(s.top()) == 0)//下一个为数字
{
s1[t] = s1[t] + s.top();
s.pop();
t++;
}
else
{
t++;
}
}
else if (flage == 1)//一级运算符+-
{
if (s2.empty())
{
s2.push(s.top());
s.pop();
}
else if (s2.top() == '*' || s2.top() == '/' || s2.top() == '+' || s2.top() == '-')//前一个数上级的 或同级
{
t--; t--;
s1[t] = s1[t] + temple + s1[t + 1]+temple+ s2.top() + temple;//将运算符穿起来
s2.pop();
t++;
s1[t] = ' ';
}
else
{
s2.push(s.top());//压入s2的值
s.pop();
}
}
else if (flage == 2)//二级运算符*/
{
if (s2.top() == '-' || s2.top() == '+' || s2.top() == '(' || s2.empty())//前一个数下级的 或空
{
s2.push(s.top()); s.pop();
}
else if (s2.top() == '*' || s2.top() == '/')
{
t--; t--;
s1[t] = s1[t] + temple + s1[t + 1] + temple + s2.top() + temple;//将运算符穿起来
s2.pop();
s1[t++] = ' ';
//s2.push(s.top());//压入s2的值
}
}
else if (flage == 3)//3运算符 )
{
if (s.top() == ')')
{
if (s2.top() == '+' || s2.top() == '-' || s2.top() == '*' || s2.top() == '/')
{
t--; t--;
s1[t] = s1[t] + temple + s1[t + 1] + temple + s2.top() + temple;//将运算符穿起来
s2.pop();
s1[++t] = ' ';
//s2.push(s.top());//压入s2的值
}
else if (s2.top() == '(')
{
s2.pop(); s.pop();
}
}
else
{
if (s.top() == '(')
{
s2.push(s.top()); s.pop();
}
}
}
else if (flage == -1)
{
t--; t--;
s1[t] = s1[t] + temple + s1[t + 1]+ temple + s2.top() + temple;//将运算符穿起来
s2.pop();
s1[++t] = ' ';
s.pop();
}
}
string a = s1[0];
int longt = a.length();
for (int i = 0; i < longt; i++)
{
if (a[i] == '?')
{
cout << ' ';
}
else
{
cout << a[i];
}
}
}
int main()
{
int T;
cin >> T;
while (T--)
{
string a;
stack s;
cin >> a;
int len_a = 0;
len_a = a.length();
s.push('&');
s.push('#');
while (len_a--)
{
s.push(a[len_a]);
}
sun(s);
cout << endl;
xia(s);
cout << endl;
cout << endl;
}
return 0;
}