Description
对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。
Input
输入一个算术表达式,以‘#’字符作为结束标志。
Output
输出该表达式转换所得到的后缀式。
Sample
Input
a*b+(c-d/e)*f#
Output
ab*cde/-f*+
基本栈:
#include<bits/stdc++.h>
#define ll long long
const int N = 2e6 + 10;
using namespace std;
int main()
{
char s[1111];
char st[1111];
cin>>s;
int i;
int top=0;
for(i=0;s[i]!='#';i++)
{
if(s[i]>='a'&&s[i]<='z')
{
cout<<s[i];
}
else if(s[i]=='(')
{
st[++top]=s[i];
}
else if(s[i]==')')
{
while(top&&st[top]!='(')
{
cout<<st[top--];
}
top--;
}
else if(s[i]=='+'||s[i]=='-')
{
while(top&&st[top]!='(')
{
cout<<st[top--];
}
st[++top]=s[i];
}
else if(s[i]=='*'||s[i]=='/')
{
while(top&&st[top]!='('&&(st[top]=='*'||st[top]=='/'))
{
cout<<st[top--];
}
st[++top]=s[i];
}
}
while(top)
{
cout<<st[top--];
}
return 0;
}
STL栈:
#include <iostream>
#include<bits/stdc++.h>
#define ll long long
using namespace std;
stack<char>dp;
int main()
{
char s[1111];
cin>>s;
int i;
for(i=0; s[i]!='#'; i++)
{
if(s[i]>='a'&&s[i]<='z')
cout<<s[i];
else if(s[i]=='(')
dp.push(s[i]);
else if(s[i]==')')
{
while(!dp.empty()&&dp.top()!='(')
{
cout<<dp.top();
dp.pop();
}
dp.pop();
}
else if(s[i]=='+'||s[i]=='-')
{
while(!dp.empty()&&dp.top()!='(')
{
cout<<dp.top();
dp.pop();
}
dp.push(s[i]);
}
else if(s[i]=='*'||s[i]=='/')
{
while(!dp.empty()&&dp.top()!='('&&(dp.top()=='*'||dp.top()=='/'))
{
cout<<dp.top();
dp.pop();
}
dp.push(s[i]);
}
}
while(!dp.empty())
{
cout<<dp.top();
dp.pop();
}
return 0;
}