中缀表达式变为后缀表达式,栈实现

#include <stdio.h>
#define MaxSize 50

typedef struct{
    char data[MaxSize];
    int top;
}SqStack;

void InitStack(SqStack &S){
    S.top = -1;
}
int StackEmpty(SqStack &S){
    if(S.top == -1)
        return 1;
    else
        return 0;
}
void Push(SqStack &S,char x){
    if(S.top==MaxSize -1)
        return ;
    S.data[++S.top] = x;
}
void Pop(SqStack &S,char &x){
    if(S.top== -1)
        return;
    x = S.data[S.top--];

}
void GetTop(SqStack &S,char &x){
    if(S.top== -1)
        return ;
    x = S.data[S.top];
}
/*
    逆序 输出
*/
void InverseStack(SqStack &S,SqStack &S1){
    char x;
    while(S.top > -1){
        Pop(S,x);
        Push(S1,x);
    }
    while(!StackEmpty(S1)){
        Pop(S1,x);
        printf("%c",x);
    }

}

/*
    括号匹配
*/
int Bracket_Match(char t[],int length){

    SqStack S;
    InitStack(S);
    int i=0;
    while(i<length){
        char x ;
        if(t[i]==‘(‘ || t[i]==‘[‘ || t[i]==‘{‘){
            Push(S,t[i++]);
        }else {
            Pop(S,x);
            if(t[i] == ‘)‘ && x == ‘(‘){
                i++;
            }
            else if(t[i] == ‘]‘ && x ==‘[‘){
                i++;
            }
            else if(t[i] == ‘}‘ && x ==‘{‘){
                i++;
            }else{
                return 0;
            }
        }
    }

    return 1;
}
/*
    中缀转为后缀
*/
int isNum(char x){
    if(x<=‘9‘ && x>=‘0‘){
        return 1;
    }else{
        return 0;
    }
}
int notPirio(char x,char exp){
    if((exp == ‘*‘ || exp == ‘/‘) && (x == ‘*‘ || x == ‘/‘)){
        return 1;
    }else if((exp == ‘+‘ || exp ==‘-‘) && (x == ‘+‘ || x==‘-‘)){
        return 1;
    }else if((exp == ‘+‘ || exp ==‘-‘) && (x == ‘*‘ || x == ‘/‘)){
        return 1;
    }else {
        return 0;
    }
}
void Postfix_exp(char exp[]){
    SqStack s1,s2;
    InitStack(s1);
    InitStack(s2);
    int i = 0;
    int count =0;
    char x;
    while(exp[i] != ‘\0‘){
        if(isNum(exp[i])){
            Push(s1,exp[i]);
            i++;
        }else if(exp[i] == ‘(‘){
            Push(s2,exp[i]);
            i++;
        }else if(exp[i] == ‘)‘){
            Pop(s2,x);
            while(x != ‘(‘){
                Push(s1,x);
                Pop(s2,x);
            }
            i++;
        }else{
            if(StackEmpty(s2)){
                Push(s2,exp[i++]);
            }
            else{
                GetTop(s2,x);
                while(notPirio(x,exp[i]) && !StackEmpty(s2)){
                    Pop(s2,x);
                    Push(s1,x);
                    GetTop(s2,x);
                }
                Push(s2,exp[i]);
                i++;
            } 

        }
    }
    while(!StackEmpty(s2)){
        Pop(s2,x);
        Push(s1,x);
    }
    InverseStack(s1,s2);

}
int main(){

    char tt[30]={
        ‘2‘,‘/‘,‘1‘,‘+‘,‘2‘,‘*‘,‘8‘,‘*‘,‘(‘,‘4‘,‘-‘,‘5‘,‘)‘,‘\0‘
    };
    char t[30]={
        ‘1‘,‘*‘,‘(‘,‘2‘,‘+‘,‘3‘,‘)‘,‘\0‘
    };
    Postfix_exp(tt);
    return 0;
}
时间: 2024-10-27 17:11:20

中缀表达式变为后缀表达式,栈实现的相关文章

中缀表达式变为后缀表达式

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

栈的应用之中缀表达式转后缀表达式

1,中缀表达式的定义及为什么要将中缀表达式转换为后缀表达式? 中缀表达式(中缀记法) 中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于操作数的中间.中缀表达式是人们常用的算术表示方法. 虽然人的大脑很容易理解与分析中缀表达式,但对计算机来说中缀表达式却是很复杂的,因此计算表达式的值时,通常需要先将中缀表达式转换为前缀或后缀表达式,然后再进行求值.对计算机来说,计算前缀或后缀表达式的值要比中缀表达式简单. 比如,计算机计算后缀表达式的过程如下----后缀表达式的计算机求值: 从左

数据结构——栈——中缀表达式和后缀表达式

什么是中缀表达式,什么是后缀表达式 我们一般看见的多项式计算都是中缀表达式构成的:1+2*3+4/3 类似这种,为什么说是中缀呢?因为它的计算符号都是在两个数中间的. 那么自然而然的明白了后缀表达式是一种计算符号在两个数后面的. 如123*+43/+ 中缀表达式和后缀表达式有什么关系? 其实仔细你就会发现,上面给出的式子其实都是一样的,只是计算的顺序在后缀表达式中你看不懂而已. 因为我们习惯去看中缀表达式的计算. 其实他们之间是可以互相转换的.他们也可以表达同一个意思,同一个计算式子. 为什么会

将中缀表达式转换为后缀表达式,然后利用栈对表达式求值。

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="js.js"></script> </head> <body> 输入中缀表达式空格分隔 例如 2 + 3 <input type=

栈的应用:中缀表达式转为后缀表达式

1.中缀表达式转为后缀表达式 规则:(栈实现) 1)如果遇到操作数,我们就直接将其输出. 2)如果遇到操作符,则我们将其放入到栈中,遇到左括号时我们也将其放入栈中. 3)如果遇到一个右括号,则将栈元素弹出,将弹出的操作符输出直到遇到左括号为止.注意,左括号只弹出并不输出. 4)如果遇到任何其他的操作符,如(“+”, “*”,“(”)等,从栈中弹出元素直到遇到发现更低优先级的元素(或者栈为空)为止.弹出完这些元素后,才将遇到的操作符压入到栈中.有一点需要注意,只有在遇到" ) "的情况下

Python与数据结构[1] -&gt; 栈/Stack[1] -&gt; 中缀表达式与后缀表达式的转换和计算

中缀表达式与后缀表达式的转换和计算 目录 中缀表达式转换为后缀表达式 后缀表达式的计算 1 中缀表达式转换为后缀表达式 中缀表达式转换为后缀表达式的实现方式为: 依次获取中缀表达式的元素, 若元素为操作数(数字/字母等),则加入后缀表达式中 若元素为操作符,则压入栈中,此时对比入栈操作符与栈内元素的计算等级,等级大于或等于入栈元素的栈内操作符都将被弹出栈,加入到后缀表达式中 左括号直接入栈,优先级最高,不弹出栈内元素 右括号不入栈,而是弹出所有元素加入后缀表达式,直至遇见匹配的左括号,并弹出左括

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

** * 中缀表达式转后缀表达式 * * 作用:将一长串计算表达式转换为计算机易于操作的字符序列,用于计算器的设计 *  * 参与转换运算符 * +-/*()^% * * * 使用StringBuilder来保存转换出的后缀表达式 * 使用栈来操作运算符 * * * 转换原则 * 1.上述字符中()没有优先级值,+-优先级值为1,/*%优先级值为2,^优先级值为3 * 2.对于一个待计算的表达式,从左向右逐个检查每个字符 * 3.遇到数字,直接append到StringBuilder * 4.遇

ZH奶酪:Python 中缀表达式转换后缀表达式

实现一个可以处理加减乘数运算的中缀表达式转换后缀表达式的程序: 一个输入中缀表达式inOrder 一个输出池pool 一个缓存栈stack 从前至后逐字读取inOrder 首先看一下不包含括号的: (1)操作数:直接输出到pool (2)操作符:判断当前操作符与stack[top]操作符的优先级 <1>当前操作符优先级高于stack[top]:将当前操作符添加到stack中: <2>当前操作符优先级低于或等于stack[top]:从stack[top]开始出栈,直到stack[to

经典白话算法之中缀表达式和后缀表达式

一.后缀表达式求值 后缀表达式也叫逆波兰表达式,其求值过程可以用到栈来辅助存储. 假定待求值的后缀表达式为:6  5  2  3  + 8 * + 3  +  *,则其求值过程如下: (1)遍历表达式,遇到的数字首先放入栈中,依次读入6 5 2 3 此时栈如下所示: (2)接着读到"+",则从栈中弹出3和2,执行3+2,计算结果等于5,并将5压入到栈中. (3)然后读到8(数字入栈),将其直接放入栈中. (4)读到"*",弹出8和5,执行8*5,并将结果40压入栈中