中缀表达式转后缀表达式

输入一个中缀表达式,编程输出其后缀表达式,要求输出的后缀表达式的运算次序与输入的中缀表达式的运算次序相一致。为简单起见,假设输入的中缀表达式由+(加)、-(减)、×(乘)、/(除)四个运算符号以及左右圆括号和英文字母组成,其中算术运算符遵守先乘除后加减的运算规则。假设输入的中缀表达式长度不超过300个字符,且都是正确的,即没有语法错误,并且凡出现括号其内部一定有表达式,即内部至少有一个运算符号。

中缀表达式转后缀表达式的方法:
1.遇到操作数:直接输出(添加到后缀表达式中)
2.栈为空时,遇到运算符,直接入栈
3.遇到左括号:将其入栈
4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,括号不输出。
5.遇到其他运算符:加减乘除:弹出所有优先级大于或者等于该运算符的栈顶元素,然后将该运算符入栈
6.最终将栈中的元素依次出栈,输出。

只有一行,为中缀表达式

只有一行,为转换后的后缀表达式

X+A*(Y-B)-Z/F

XAYB-*+ZF/-

点击查看代码

/***顺序栈的实现***/
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
using namespace std;

//&#x987A;&#x5E8F;&#x6808;&#x5B9A;&#x4E49;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE  100001 //&#x987A;&#x5E8F;&#x6808;&#x5B58;&#x50A8;&#x7A7A;&#x95F4;&#x7684;&#x521D;&#x59CB;&#x5206;&#x914D;&#x91CF;
typedef int Status;
typedef char SElemType;

typedef struct
{
    SElemType *base;//&#x6808;&#x5E95;&#x6307;&#x9488;
    SElemType *top;//&#x6808;&#x9876;&#x6307;&#x9488;
    int stacksize;//&#x6808;&#x53EF;&#x7528;&#x7684;&#x6700;&#x5927;&#x5BB9;&#x91CF;
} SqStack;

//&#x7B97;&#x6CD5;3.1&#x3000;&#x987A;&#x5E8F;&#x6808;&#x7684;&#x521D;&#x59CB;&#x5316;
Status InitStack(SqStack &s)
{
    //&#x6784;&#x9020;&#x4E00;&#x4E2A;&#x7A7A;&#x6808;S
    s.base = new SElemType[MAXSIZE];//&#x4E3A;&#x987A;&#x5E8F;&#x6808;&#x52A8;&#x6001;&#x5206;&#x914D;&#x4E00;&#x4E2A;&#x6700;&#x5927;&#x5BB9;&#x91CF;&#x4E3A;MAXSIZE&#x7684;&#x6570;&#x7EC4;&#x7A7A;&#x95F4;
    if(!s.base)
        exit(OVERFLOW); //&#x5B58;&#x50A8;&#x5206;&#x914D;&#x5931;&#x8D25;
    s.top = s.base; //top&#x521D;&#x59CB;&#x4E3A;base&#xFF0C;&#x7A7A;&#x6808;
    s.stacksize = MAXSIZE; //stacksize&#x7F6E;&#x4E3A;&#x6808;&#x7684;&#x6700;&#x5927;&#x5BB9;&#x91CF;MAXSIZE
    return OK;
}

//&#x7B97;&#x6CD5;3.2&#x3000;&#x987A;&#x5E8F;&#x6808;&#x7684;&#x5165;&#x6808;
Status Push(SqStack &s, SElemType e)
{
    if(s.top - s.base==MAXSIZE)
    {
        return ERROR;
    }
    *s.top++=e;
    return OK;
}

//&#x7B97;&#x6CD5;3.3&#x3000;&#x987A;&#x5E8F;&#x6808;&#x7684;&#x51FA;&#x6808;
Status Pop(SqStack &s, SElemType &e)
{
    if(s.top == s.base) return ERROR;
    e=*--s.top;
    return OK;
}

//&#x7B97;&#x6CD5;3.4&#x3000;&#x53D6;&#x987A;&#x5E8F;&#x6808;&#x7684;&#x6808;&#x9876;&#x5143;&#x7D20;
SElemType GetTop(SqStack s)  //&#x8FD4;&#x56DE;S&#x7684;&#x6808;&#x9876;&#x5143;&#x7D20;&#xFF0C;&#x4E0D;&#x4FEE;&#x6539;&#x6808;&#x9876;&#x6307;&#x9488;
{
    if(s.top!=s.base) return *(s.top-1);
}

char comp(char a,char b)
{
    char x;
    if(a=='+'||a=='-')
    {
        if(b=='+'||b=='-')
        {
            x='=';
        }else if(b=='*'||b=='/')
        {
            x='<'; } }else if(a="='*'||a=='/')" { if(b="='+'||b=='-')" x=">" ; return x; int main() sqstack s; char op[100001]; i; initstack(s); gets(op); for(i="0;" op[i]!="\0" i++) if((op[i]>='a'&&op[i]<='z')||(op[i]>='A'&&op[i]<='z')) { cout<<op[i]; } else if(s.top="=s.base)" if(op[i]="='+'||op[i]=='-'||op[i]=='*'||op[i]=='/')" push(s,op[i]); }else while(gettop(s)!="(" &&(s.top!="s.base))" cout<<gettop(s); pop(s,op[i]); while(comp(gettop(s),op[i])="='">'||comp(GetTop(s),op[i])=='=')
            {
                if(s.top!=s.base)
                {
                    cout<<gettop(s); pop(s,*(s.top)); } push(s,op[i]); while(s.top!="s.base)" { cout<<gettop(s); pop(s,op[i]); return 0; < code></gettop(s);></='z'))></='z')||(op[i]></';></cstring></cstdio></cstdlib></iostream>

Original: https://www.cnblogs.com/ouhouyi/p/16410533.html
Author: 蚂蚁追风筝
Title: 中缀表达式转后缀表达式

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/603087/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球