中缀表达式转化为后缀表达式

复制代码
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
typedef struct StackNode* LStack;
struct StackNode {
    char data;
    LStack next;
};
void InitStack(LStack &s)
{
    s = NULL;
}
void Creat(LStack &s, char a)
{
    LStack p = new StackNode;
    p->data = a;
    p->next = s;
    s = p;
}
void Pop(LStack &s)
{
    LStack q;
    q = s;
    s = s->next;
    delete q;
}
char GetTop(LStack &s)
{
    if (s == NULL)
        return NULL;
    return s->data;
}
int f(char s)//优先级
{
    int p;
    if (s == '*' || s == '/')
        p = 2;
    else
        if (s == '+' || s == '-')
            p = 1;
    return p;
}
int main()
{
    string s;
    while (cin >> s && s != "=")
    {
        LStack q;
        InitStack(q);//中间结果
        LStack p;//运算符
        InitStack(p);
        for (int i = 0; i < s.size(); i++)
        {
            if (s[i] >= '0'&&s[i] <= '9')
            {
                Creat(q, s[i]);
            }
            else
            {
                if (s[i] == '(')
                    Creat(p, s[i]);
                else
                    if (s[i] == ')')
                    {
                        while (GetTop(p) != '(')
                        {
                            Creat(q, GetTop(p));
                            Pop(p);
                        }
                        Pop(p);
                    }
                    else
                    {
                        if (s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/')
                        {

                            while (1)
                            {

                                int pp = f(s[i]);//得到优先级
                                if (GetTop(p) == '(' || p == NULL)
                                {
                                    Creat(p, s[i]);
                                    break;
                                }
                                else
                                {
                                    int qq = f(GetTop(p));
                                    if (qq <pp)
                                    {
                                        Creat(p, s[i]);
                                        break;
                                    }
                                    else
                                        if (pp <=qq)
                                        {
                                            Creat(q, GetTop(p));
                                            Pop(p);
                                        }
                                }
                            }
                        }
                        else
                            if (s[i] == '=')
                            {
                                while (p)
                                {
                                    Creat(q, GetTop(p));
                                    Pop(p);
                                }
                            }
                    }
            }

        }
        char t[1000];
        int count = 0;
        for (int i = 0;; i++)
        {
            t[i] = GetTop(q);
            Pop(q);
            count++;
            if (q == NULL)
                break;
        }
        for (int i = count - 1; i > 0; i--)
        {
            cout << t[i];
        }
        cout << t[0] << endl;
    }
    return 0;
}
复制代码

错误原因:

1、没有考虑到运算符栈空的时候,运算符怎么push

2、当s[i]是运算符的时候,而且和p栈顶元素的优先级一样的话,怎么处理。

posted @   Tomorrow1126  阅读(164)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· 单线程的Redis速度为什么快?
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
点击右上角即可分享
微信分享提示