表达式计算:将中缀表达式利用栈转为后缀表达式,并完成计算

利用栈求表达式的值,先判断表达式是否正确,再计算。(用C语言完成)
功能要求:
(1)输入带有()、[]、{}的加减乘除混合运算表达式;
(2)先判断括号是否匹配,如果匹配错误,提示重新输入;
(3)如果表达式正确,将中缀表达式利用栈转为后缀表达式,并完成计算。

要先判断括号是否匹配,然后输出后缀表达式,最后输出结果。例:输入1+{[2*(3+4)-5]/3}+2=

http://t.csdn.cn/G44ce
我的文章中有详细的代码,可以参考一下

解答如下

img

#include <stdio.h>
#include <malloc.h>
#define MAXSIZE 100
using namespace std;
typedef char datatype;
typedef struct seqstack
{
    datatype elem[MAXSIZE];
    int top;
} seqstack;
void init(seqstack *s)
{
    s->top=-1;
}
int empty(seqstack s)
{
    return(s.top==-1? 1:0);
}
void push(seqstack *s,datatype x)
{
    if(s->top==MAXSIZE-1)
    {
        exit(1);
    }
    s->top++;
    s->elem[s->top]=x;
}
datatype pop(seqstack *s)
{
    datatype x;
    if(s->top==-1)
    {
        exit(1);
    }
    x=s->elem[s->top];
    s->top--;
    return x;
}
int match_kuohao(char c[])
{
    int i=0;
    seqstack *s;
    s=(seqstack *)malloc(sizeof(seqstack));
    init(s);
    while(c[i]!='\0')
    {
        switch(c[i])
        {
            case '{':
            case '[':
            case '(':
                push(s,c[i]);
                break;
            case '}':
                if(!empty(*s) && pop(s)=='{'  ) break;
                else return 0;
            case ']':
                if(!empty(*s) && pop(s)=='['  ) break;
                else return 0;
            case ')':
                if(!empty(*s) && pop(s)=='('  ) break;
                else return 0;
        }
        i++;
    }
    return (empty(*s)==1);
}
#include<stdio.h>
#include<string.h>
 
 
//data top 是用来存储字符 intdata inttop 是存储整数化的数据 
typedef struct Stack{ 
    char* data;
    int* intdata;
    int top;
    int inttop;
}Stack;
 

 
bool InitStack(Stack &s){
    s.top=-1;
    s.inttop=-1;
    s.data=new char[20];
    s.intdata=new int[20];       
}
 
bool Pust(Stack &s,char a){
    if(s.top==20)
       return false;
    s.top++;
    s.data[s.top]=a;
}
bool Pop(Stack &s,char &e){
    if(s.top==-1)
        return false;
    e=s.data[s.top];
    s.top--;
}
bool Pustint(Stack &s,int a){
    if(s.inttop==20)
       return false;
    s.inttop++;
    s.intdata[s.inttop]=a;
}
bool Popint(Stack &s,int &e){
    if(s.inttop==-1)
        return false;
    e=s.intdata[s.inttop];
    s.inttop--;
}
int Yxj(char a){
    // + - * / (优先级为  1 1 2 2 3
    if(a=='+' || a=='-') return 1;
    else if(a=='*' || a=='/') return 2;
    else if (a=='(') return 3;
    else return -1;
}
Stack CTOB(char string[]){
        // (1+3)-2*8     - * +
    Stack num,op;
    InitStack(num);//数字栈 
    InitStack(op);//符号栈
    
    for(int i=0;i<strlen(string);i++){
        
        if(string[i]>=48 && string[i]<=57)
            Pust(num,string[i]);
        
        else{
            if(op.top==-1) Pust(op,string[i]);// 符号栈为空直接入 
            else if(op.data[op.top]=='(')  Pust(op,string[i]);      //上一个符号为( 直接入 
            
            else if(string[i]==')'){
                while(op.data[op.top]!='('){
                    char e;
                    Pop(op,e);
                    Pust(num,e);
                }
                    char e;
                    Pop(op,e);
                    //Pust(num,e);
            } 
            else if(Yxj(string[i])>Yxj(op.data[op.top])) Pust(op,string[i]);  //优先级大于栈前一个直接入
            
            else if(Yxj(string[i])<=Yxj(op.data[op.top])){       //优先级低于前面的 
                int y=op.top;
                while(Yxj(op.data[y])>=Yxj(string[i])){   
                    char e;
                    Pop(op,e);
                    y--;
                    Pust(num,e);
                    Pust(op,string[i]);
                    if(op.data[y]=='(') break;
                }
            }
        }    
    }
    while(op.top!=-1){
        char e;
        Pop(op,e);
        Pust(num,e);
    }
    return num;
}
bool Compute_back(Stack back){
    int f;// 前操作数
    int r;//后操作数 
    for(int i=0;i<=back.top;i++){
        if(back.data[i]>=48 & back.data[i]<=57){
            Pustint(back,(int)back.data[i]-48);
        }
        else{
            if(back.data[i]=='+'){
                Popint(back,r);
                Popint(back,f);
                Pustint(back,f+r);
            }
            else if(back.data[i]=='-'){
                Popint(back,r);
                Popint(back,f);
                Pustint(back,f-r);
            }
            else if(back.data[i]=='*'){
                Popint(back,r);
                Popint(back,f);
                Pustint(back,f*r);
            }
            else if(back.data[i]=='/'){
                Popint(back,r);
                Popint(back,f);
                Pustint(back,f/r);
            }
        }
    }
    
    printf("\n%d\n",back.intdata[back.inttop]);
 
} 
int main()
{
    char s[255];
    gets(s);
    if(!match_kuohao(s))
    {
        printf("Unbalanced");
        return 0;
    }
    else
    {
        //printf("Unbalanced");
        bool InitStack(Stack &s);
        bool Pust(Stack &s,char a);
        bool Pop(Stack &s,char &e);
        Stack CTOB(char a[]);
        bool Compute_back(Stack back);
        int Yxj(char a);
        char string[10];  //中缀表达式
        //printf("输入中缀表达式\n");
        //scanf("%s",&string);
        Stack back=CTOB(s);   //back 为中缀转后缀的栈 
        printf("%s",back.data);
        Compute_back(back);
    }
    
    return 0;
}