栈->一般算术表达式转换成后缀式

本文介绍了一种将中缀表达式转换为后缀表达式的算法实现,包括核心步骤与C++代码示例。重点讲解了如何利用栈来处理运算符的优先级,并通过具体示例展示了整个转换过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。
Input
输入一个算术表达式,以‘#’字符作为结束标志。
Output
输出该表达式转换所得到的后缀式。
Example Input
a*b+(c-d/e)*f#
Example Output
ab*cde/-f*+

这道题在一开始学栈的时候还是比较头疼的,现在看来还是比较简单的,主要是一些操作麻烦了点,参考了百度百科里的步骤,,,

·数字时,加入后缀表达式;
·运算符:
a. 若为 '(',入栈;
b. 若为 ')',则依次把栈中的的运算符加入后缀表达式中,直到出现'(',从栈中删除'(' ;
c. 若为 除括号外的其他 运算符, 当其优先级高于除'('以外的栈顶运算符时,直接入栈。否则从栈顶开始,依次弹出比当前处理的 运算符优先级高和优先级相等的运算符,直到一个比它优先级低的或者遇到了一个左括号为止。
·当扫描的中缀表达式结束时,栈中的的所有运算符 出栈

这样步骤就很清楚了

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <stack>

using namespace std;
const int N = 100;

int Push(char a, char b)   //根据运算符的优先级判断能否入栈
{
    if(a == '*' || a == '/')
        return 0;
    if(b == '*' || b == '/' || a == '(')
        return 1;
    return 0;
}
int main()
{
    char str[N];
    stack<char> s;
    scanf("%s", str);
    int len = strlen(str);
    for(int i = 0; i < len-1; i++)
    {
        if(str[i] >= 'a' && str[i] <= 'z')  //运算数直接输出到后缀式中
            printf("%c", str[i]);
        else
        {
            if(str[i] == '(')  
                s.push(str[i]);
            else if(str[i] == ')')
            {
                while(s.top() != '(')
                {
                    printf("%c", s.top());
                    s.pop();
                }
                s.pop();
            }
            else
            {
                while(!s.empty() && !Push(s.top(), str[i]))
                {
                    printf("%c", s.top());
                    s.pop();
                }    
                s.push(str[i]);
            }
        }
    }
    while(!s.empty())
    {
        printf("%c", s.top());
        s.pop();
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值