数据结构实验之栈与队列二:一般算术表达式转换成后缀式

来源:互联网 发布:mysql 添加分区出错 编辑:程序博客网 时间:2024/06/01 15:38

Problem Description

对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。

Input

输入一个算术表达式,以‘#’字符作为结束标志。

Output

输出该表达式转换所得到的后缀式。

Example Input

a*b+(c-d/e)*f#

Example Output

ab*cde/-f*+

Hint

Author

      
#include <iostream>#include <stdio.h>#include <stdlib.h>#include <string.h>using namespace std;typedef char selemtype;typedef int status;#define stackmax 10000#define stacknum 10#define true 1#define error 0typedef struct{    selemtype *base;    selemtype *top;    int stacksize;} sqstack;int initstack(sqstack &S){    S.base=new selemtype[stackmax];    S.top=S.base;    S.stacksize=stackmax;    return 1;}int push(sqstack &S, selemtype e){    if(S.top-S.base>=stackmax)    {        S.base=(selemtype *)realloc(S.base,(S.stacksize+stacknum) * sizeof(selemtype));        S.top=S.base+S.stacksize;        S.stacksize+=stacknum;    }    *S.top++=e;    return 1;}int pop(sqstack &S, selemtype &e){    if(S.top==S.base)        return 0;    e=*--S.top;    return 1;}status stackempty(sqstack &S){    if(S.base==S.top)        return true;    else        return false;}int compare(char a){    if(a=='*'||a=='/')        return 2;    else if(a=='+'||a=='-')        return 1;    else if(a=='(')        return 3;    else if(a==')')        return 4;    return 0;}int main(){    sqstack S;    initstack(S);    selemtype e;    char exp[1000];    int i=0,a=0;    char s[1000];    while(~scanf("%c",&s[i])&&s[i]!='#')    {        if((s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z'))        {            exp[a++]=s[i];        }        else        {            if(stackempty(S))            {                push(S,s[i]);            }            else if(compare(s[i])>compare(*(S.top-1)))            {                if(compare(s[i])==4)                {                    while(*(S.top-1)!='(')                    {                        exp[a++]=*(S.top-1);                        pop(S,e);                    }                    pop(S,e);                }                else                {                    push(S,s[i]);                }            }            else            {                if(*(S.top-1)!='(')                {                    exp[a++]=*(S.top-1);                    pop(S,e);                    push(S,s[i]);                }                else                    push(S,s[i]);            }        }        i++;    }    while((!stackempty(S)))    {        exp[a++]=*(S.top-1);        pop(S,e);    }    for(i=0; i<strlen(exp); i++)    {        cout<<exp[i];    }    printf("\n");    return 0;}
阅读全文
0 0