数据结构实验之栈与队列二:一般算术表达式转换成后缀式
Time Limit: 1000 ms
Memory Limit: 65536 KiB
Problem Description
对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。
Input
输入一个算术表达式,以‘#’字符作为结束标志。
Output
输出该表达式转换所得到的后缀式。
Sample Input
a*b+(c-d/e)*f#
Sample Output
ab*cde/-f*+
中缀表达式转化为后缀表达式步骤:
一.左到右遍历,遇到字母直接输出;
二.遇到操作符:
1.若栈为空或栈顶元素为(,则直接压栈.
2.若栈顶元素为普通操作符,则比较优先级,若待压栈的操作符比栈顶操作符优先级高,则直接压栈,否则将栈顶元素出栈,再接着比较继续和栈顶元素的优先级.
3.若遇到),则依次弹出栈顶的运算符,直到遇到(为止,此时将这一对括号丢弃.
4. 最后将栈中剩余的运算符依次弹出栈.
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int main()
{
string a;
stack<char>s;
cin>>a;
for(int i=0; a[i]!='#'; i++)
{
if(a[i]>='a'&&a[i]<='z')
cout<<a[i];
else if(a[i]=='(')
s.push(a[i]);
else if(a[i]==')')
{
while(s.top()!='(')
{
cout<<s.top();
s.pop();
}
s.pop();
}
else if(a[i]=='*'||a[i]=='/')
{
while(!s.empty()&&(s.top()=='/'||s.top()=='*')&&s.top()!='(')
{
cout<<s.top();
s.pop();
}
s.push(a[i]);
}
else if(a[i]=='+'||a[i]=='-')
{
while(!s.empty()&&s.top()!='(')
{
cout<<s.top();
s.pop();
}
s.push(a[i]);
}
}
while(!s.empty())
{
cout<<s.top();
s.pop();
}
return 0;
}