余skr 2023-04-01 15:44 采纳率: 92.3%
浏览 10
已结题

关于#中缀转后缀#的问题,如何解决?

中缀表达式是一个通用的算术或逻辑公式表示方法,操作符是以中缀形式处于操作数的中间(例:3 + 4),中缀表达式是人们常用的算术表示方法。后缀表达式不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则,如:(2 + 1) * 3 , 即2 1 + 3 *。利用栈结构,将中缀表达式转换为后缀表达式。(测试数据元素为单个字符)
输入
中缀表达式
输出
后缀表达式
样例输入
A+(B-C/D)E
样例输出
ABCD/-E
+
没发现错误的地方,请帮我指出并改正,谢谢。


#include<bits/stdc++.h>
using namespace std;
char Precede(char a, char b){
    if (a == '+' || a == '-'){
        if (b == '+' || b == '-' || b == ')' || b == '#'){
            return '>';
        }else{
            return '<';
        }
    }else if (a == '*' || a == '/'){
        if (b == '+' || b == '-' || b == '*' || b == '/' || b == ')' || b == '#'){
            return '>';
        }else{
            return '<';
        }
    }else if (a == '('){
        if (b == ')'){
            return '=';
        }else if (b == '#'){    
            return '?';
        }else{
            return '<';
        }
    }else if (a == '#'){
        if (b == '#'){
            return '=';
        }else if (b == ')'){    
            return '?';
        }else {
            return '<';
        }
    }
}
int main(){
    stack<char>s;
    stack<char>z;
    char b='#';
    char d[10005]={0};
    z.push(b);
    char a[10005];
    scanf("%s",a);
    int n,i,j;
    n=strlen(a);
    a[n]=b;
    for(i=0;i<=n;i++){
        if(a[i]!='*'&&a[i]!='+'&&a[i]!='-'&&a[i]!='/'&&a[i]!='#'&&a[i]!='('&&a[i]!=')'){
            s.push(a[i]);
        }
        else if((Precede(z.top(),a[i]))=='<'){
            z.push(a[i]);
        }else if((Precede(z.top(),a[i]))=='>'){
            if(a[i]!=')'){
            s.push(z.top());
            z.pop();
            i--;
            }
            else if(a[i]==')'){
                for(;z.top()!='(';){
                s.push(z.top());
                z.pop();
                }
                z.pop();
            }
        }else if((Precede(z.top(),a[i]))=='='){
            z.pop();
        }
    }
    while(!s.empty()){
    d[i]=s.top();
    i++;
    s.pop();
}
for(i--;i>=0;i--){
    printf("%c",d[i]);
}
}
  • 写回答

2条回答 默认 最新

  • Vayne16 2023-04-01 15:48
    关注

    中缀转后缀是一种常见的算法,可以使用栈结构来实现。首先,定义一个优先级函数,用于比较运算符的优先级;然后,将中缀表达式的每个字符读入栈中,如果是操作数,则直接输出;如果是运算符,则比较其与栈顶元素的优先级,如果优先级比栈顶元素高,则将其压入栈中;如果优先级比栈顶元素低或者相等,则将栈顶元素弹出,并输出,直到栈顶元素的优先级比当前元素低,然后将当前元素压入栈中;最后,当读取完所有字符后,将栈中剩余的元素依次弹出,并输出,即可得到后缀表达式。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月10日
  • 已采纳回答 4月2日
  • 创建了问题 4月1日

悬赏问题

  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度