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

来源:互联网 发布:柴鸡蛋逆袭网络剧下载 编辑:程序博客网 时间:2024/05/20 20:03

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

Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

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

输入

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

输出

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

示例输入

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

示例输出

ab*cde/-f*+

提示

 
#include<iostream>#include<cstdlib>#include<string>#define STACK_INIT_SIZE 100//存储空间初始分配量#define STACKINCREMENT 10//存储空间分配增量using namespace std;typedef struct{    char *base;    char *top;    int stacksize;}SqStack;SqStack S;int InitStack(SqStack &S)//构造一个空栈{    S.base=(char *)malloc(STACK_INIT_SIZE*sizeof(char ));    if(!S.base)        exit(0);    S.top=S.base;    S.stacksize = STACK_INIT_SIZE;    return 1;}char GetTop(SqStack S,char &e)//获取栈顶元素{    if(S.top==S.base)        return 0;    e=*(S.top-1);    return 1;}int Push(SqStack &S,char e)////压栈,插入元素e为新的栈顶元素{    if(S.top-S.base>=S.stacksize)//栈满,追加存储空间    {        S.base=(char *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(char ));        if(!S.base)            exit(0);        S.top=S.base+S.stacksize;        S.stacksize+=STACKINCREMENT;    }    *S.top++=e;    return 1;}int Pop(SqStack &S,char &e)//出栈{    if(S.top==S.base)        return 0;    e=*(S.top--);    return 1;}int StackEmpty(SqStack S)//判空{    if(S.top==S.base)        return true;    else        return false;}int youxian(char c)//符号优先级判断{    if(c=='+'||c=='-')        return 1;    if(c=='*'||c=='/')        return 2;    if(c=='(')        return 3;    if(c==')')        return 4;}int main(){    char etop,epop;    string str;    cin>>str;    int i=0;    while(str[i]!='#')    {        if(str[i]>='a'&&str[i]<='z'){            cout<<str[i]; //如果不是符号直接输出        }        else        {            if(StackEmpty(S))                Push(S,str[i]);//如果栈为空,符号直接进栈            else//否则判断要进入的元素和栈顶元素的优先级            {                GetTop(S,etop);                if(youxian(str[i])>=youxian(etop))//如果优先级高于栈顶元素                {                    if(youxian(str[i])==4)//如果为‘)’,则将‘(’右边的元素出栈                    {                        GetTop(S,etop);                        while(etop!='(')                        {                            cout<<etop;                            Pop(S,epop);                            GetTop(S,etop);                        }                        Pop(S,epop);//删除‘(’                    }                    else//若不是‘)’,则进栈                    {                        Push(S,str[i]);                    }                }                else//如果优先级低于栈顶元素                {                    if(etop!='(')//判断栈顶元素是否为‘(’,如果不是栈顶元素出栈,当前元素进栈                    {                        Pop(S,epop);                        cout<<etop;                        Push(S,str[i]);                    }                    else//是‘(’进栈                    {                        Push(S,str[i]);                    }                }            }        }        i++;    }    GetTop(S,etop);    while(!StackEmpty(S))//将栈中元素出栈    {        cout<<etop;        Pop(S,epop);        GetTop(S,etop);    }    cout<<endl;    return 0;}
0 0
原创粉丝点击