数据结构实验之栈二:一般算术表达式转换成后缀式
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。
输入
输入一个算术表达式,以‘#’字符作为结束标志。
输出
输出该表达式转换所得到的后缀式。
示例输入
a*b+(c-d/e)*f#
示例输出
ab*cde/-f*+
提示
思路:
1 ·当读到数字直接送至输出队列中
2 ·当读到运算符时,将栈中所有优先级高于或等于t的运算符弹出,送到输出队列中;然后进栈
2 ·当读到运算符时,将栈中所有优先级高于或等于t的运算符弹出,送到输出队列中;然后进栈
3 ·读到左括号时总是将它压入栈中
4 ·读到右括号时,将靠近栈顶的第一个左括号上面的运算符全部依次弹出,送至输出队列后,再丢弃左括号。
4 ·读到右括号时,将靠近栈顶的第一个左括号上面的运算符全部依次弹出,送至输出队列后,再丢弃左括号。
#include<iostream>
#include<stack>
using namespace std;
int main()
{
char st[1000];
cin>>st;
stack<char>s;
for(int i=0;st[i]!='#';i++)
{
if(st[i]>='a'&&st[i]<='z') //如果是字母,直接输出
cout<<st[i];
else if(st[i]=='(') //如果是‘(’,直接进栈
s.push(st[i]);
else if(st[i]==')') //如果是‘)’
{
while(s.top()!='(') //如果不是左括号,一直输出
{
cout<<s.top();
s.pop();
}
s.pop(); //删除左括号
}
else if(st[i]=='*'||st[i]=='/') //如果是同优先级的输出
{
while(!s.empty()&&s.top()!='('&&(s.top()=='*'||s.top()=='/'))
{
cout<<s.top();
s.pop();
}
s.push(st[i]);
}
else //if(st[i]=='+'||st[i]=='-') //因为他俩兄弟优先级最低,输出栈内所以可能输出的元素
{
while(!s.empty()&&s.top()!='(')
{
cout<<s.top();
s.pop();
}
s.push(st[i]);
}
}
while(!s.empty()) //剩下的全部输出
{
cout<<s.top();
s.pop();
}
cout<<endl;
return 0;
}