2015年大二上-数据结构-栈(5)- 后缀表达式

来源:互联网 发布:网络公益联盟 编辑:程序博客网 时间:2024/06/05 06:26

利用sqstack.h中栈的基本运算,实现将一个中缀表达式转换为对应的后缀表达式的算法。例如,输入(56-20)/(4+2),输出后缀表达式::56#20#-4#2#+/要求在数字后加#。

/**Copyright (c) 2014,烟台大学计算机学院*All rights reserved.*文件名称:Annpion.cpp*作者:王耀鹏*完成日期:2015年11月14日*版本号:v1.0**问题描述:利用sqstack.h中栈的基本运算,实现将一个中缀表达式转换为对应的后缀表达式的算法。例如,输入(56-20)/(4+2),输出后缀表达式::56#20#-4#2#+/要求在数字后加#。*输入描述:输入一个表达式。*输出描述:输出中缀表达式对应的后缀表达式,并输出所得的值。*/#include <stdio.h>#include <malloc.h>#include "SqStack.h"#define MaxOp 7#define MaxSize 100struct{    char ch;    int pri;}lpri[]= {{'=',0},{'(',1},{'*',5},{'/',5},{'+',3},{'-',3},{')',6}},rpri[]= {{'=',0},{'(',6},{'*',4},{'/',4},{'+',2},{'-',2},{')',1}};int rightpri(char op){    for(int i=0; i<MaxOp; ++i)        if(rpri[i].ch==op)            return rpri[i].pri;}int leftpri(char op){    for(int i=0; i<MaxOp; ++i)        if(lpri[i].ch==op)            return lpri[i].pri;}int Precede(char op1,char op2){    if(leftpri(op1)>rightpri(op2))        return 1;    else if(leftpri(op1)<rightpri(op2))        return -1;    else return 0;}bool InOp(char op){    if(op=='('||op==')'||op=='+'||op=='-'||op=='*'||op=='/')        return true;    else return false;}void trans(char *exp,char postexp[]){    char ch;    int i=0;    SqStack *OpStack;    OpStack=(SqStack *)malloc(sizeof(SqStack));    InitStack(OpStack);    Push(OpStack,'=');    while(*exp!='\0')    {        if(!InOp(*exp))        {            while(*exp>='0'&&*exp<='9')            {                postexp[i++]=*exp;                ++exp;            }            postexp[i++]='#';        }        else        {            GetTop(OpStack,ch);            switch(Precede(ch,*exp))            {            case -1:                Push(OpStack,*exp);                ++exp;                break;            case 0:                Pop(OpStack,ch);                ++exp;                break;            case 1:                Pop(OpStack,ch);                postexp[i++]=ch;                break;            }        }    }    Pop(OpStack,ch);    while(ch!='=')    {        postexp[i++]=ch;        Pop(OpStack,ch);    }    postexp[i++]='\0';    DestroyStack(OpStack);}double Calculate(char *postexp){    struct calculate    {        double data[MaxSize];        int top;    };    calculate *Cal;    Cal=(calculate *)malloc(sizeof(calculate));    Cal->top=-1;    while(*postexp!='\0')    {        if(!InOp(*postexp))        {            double d=0;            while(*postexp!='#')            {                d=d*10+*postexp-'0';                ++postexp;            }            ++Cal->top;            Cal->data[Cal->top]=d;        }        else        {            switch(*postexp)            {            case '+':                Cal->data[Cal->top-1]=Cal->data[Cal->top-1]+Cal->data[Cal->top];                --Cal->top;                break;            case '-':                Cal->data[Cal->top-1]=Cal->data[Cal->top-1]-Cal->data[Cal->top];                --Cal->top;                break;            case '*':                Cal->data[Cal->top-1]=Cal->data[Cal->top-1]*Cal->data[Cal->top];                --Cal->top;                break;            case '/':                Cal->data[Cal->top-1]=Cal->data[Cal->top-1]/Cal->data[Cal->top];                --Cal->top;                break;            }        }        ++postexp;    }    return Cal->data[Cal->top];}int main(){    char exp[]="(56-20)/(4+2)"; //可将exp改为键盘输入    char postexp[200];    trans(exp,postexp);    printf("中缀表达式:%s\n",exp);    printf("后缀表达式:%s\n",postexp);    printf("表达式的值:%g",Calculate(postexp));    return 0;}

运行结果:


0 0
原创粉丝点击