题目链接
Problem Description
对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。
Input
输入一个算术表达式,以‘#’字符作为结束标志。
Output
输出该表达式转换所得到的后缀式。
Example Input
a*b+(c-d/e)*f#
Example Output
ab*cde/-f*+
#include<iostream>
#include<cstring>
#include<stack>
using namespace std;
//确定优先级
bool cmp(char ch1, char ch2){//ch1代表栈顶元素,ch2代表当前元素
if(ch1=='(')//如果有右括号的话,优先级最高,直接返回1
return 1;
if((ch1=='+'||ch1=='-')&&(ch2=='*'||ch2=='/'))
//如果栈顶元素优先级小于当前元素的话,返回1(if成立的条件)
return 1;
else
return 0;
}
int main(){
char s[110];
stack <char> S;//定义一个char类型的栈
memset(s,0,sizeof(s));//初始化栈
for(int i = 0;;i++){
cin>>s[i];
if(s[i]=='#')//遇到'#'退出
break;
}
int length = strlen(s);
for(int i = 0;i<length;i++){
if(s[i]=='#')//如果遇到'#'的话,说明到了末尾,那么直接把栈里面的元素依次输出即可
while(!S.empty()){
cout<<S.top();
S.pop();
}
if((s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z'))
cout<<s[i];//直接输出
else if(s[i]=='(')//括号优先级最高,直接入栈
S.push(s[i]);
else if(s[i]==')'){
cout<<S.top();//弹出栈顶元素,直到遇到'('
S.pop();
while(S.top()!='('){
cout<<S.top();
S.pop();
}
S.pop();//别忘了把栈中存留的'('弹出
}
else{
if(S.empty()){//如果栈为空的话,直接入栈
S.push(s[i]);
continue;//返回for循环的开始
}
if(cmp(S.top(),s[i]))//如果栈顶元素的优先级比当前读取到的优先级低,直接压栈
S.push(s[i]);
else{
//如果栈顶元素的优先级比当前优先级高,输出栈顶元素,直到遇到栈顶元素的优先级比当前的优先级低
while(!cmp(S.top(),s[i])){
cout<<S.top();
S.pop();
if(S.empty())
break;
}
S.push(s[i]);//把当前元素入栈
}
}
}
cout<<endl;
return 0;
}
本文介绍了一个算法,用于将包含基本算术运算的表达式转换为后缀表示法。通过使用栈来管理运算符的优先级,实现从标准的中缀表示法到后缀形式的有效转换。
433

被折叠的 条评论
为什么被折叠?



