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

来源:互联网 发布:联合网络图书采访 编辑:程序博客网 时间:2024/06/08 19:35

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

Problem Description
对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。
Input
输入一个算术表达式,以‘#’字符作为结束标志。
Output
输出该表达式转换所得到的后缀式。 //后缀表达式每一项的操作符均在后面
Example Input
a*b+(c-d/e)*f#

Example Output
ab*cde/-f*+

思路:遇到数值直接存入表达式。遇到操作符做判断。1.遇到右括号,把在栈里的操作符都出栈,直到遇到左括号。2.每次读到一个操作符,都要与栈顶元素做判断。如果此优先级大于栈顶元素优先级,直接push。如果小于,将栈顶元素pop,直到此优先级大于下一个(下一个,下一个)栈顶元素,再push。3.最后如果栈非空,依次pop。存入表达式数组exp【1000】。

#include <stdio.h>#include <stdlib.h>#include <string.h>#define stackmax 100000#define stacknum 100#define OK 1#define ERROR 0#define OVERFLOW -2#define TRUE 1#define FALSE 0typedef int status;typedef char selemtype;typedef struct{    selemtype *base;    selemtype *top;    int stacksize;} sqstack;int inistack(sqstack &S){    S.base=new selemtype[stackmax];    if(!S.base)        exit(OVERFLOW);    S.top=S.base;    S.stacksize=stackmax;    return OK;}int push(sqstack &S, selemtype e){    if(S.top-S.base>=S.stacksize)    {        S.base=(selemtype *)realloc(S.base,(S.stacksize+stacknum)*sizeof(selemtype));        if(!S.base)            exit(OVERFLOW);        S.top=S.base+S.stacksize;        S.stacksize+=stacknum;    }    *S.top=e;    S.top++;    return 0;}int pop(sqstack &S, selemtype &e){    if(S.base==S.top)        return ERROR;    else        e=*--S.top;    return OK;}status isempty(sqstack S){    if(S.base==S.top)        return TRUE;    else        return FALSE;}int compare(char a)//运算符返回值{    if(a=='+'||a=='-')        return 1;    else if(a=='*'||a=='/')        return 2;    else if(a=='(')        return 3;    else if(a==')')        return 4;}int main(){    sqstack S;    inistack(S);    char exp[10000];//存后缀式    char a[10000];//存输入的字符,并没有用    int i=0,num=0;//i=0初始化!    selemtype e;    while(~scanf("%c",&a[i])&&a[i]!='#')//边输入字符边判断    {        if(a[i]>='a'&&a[i]<='z'||a[i]>='A'&&a[i]<='Z')        {            exp[num++]=a[i];        }        else        {            if(isempty(S))//如果是空栈,直接进栈            {                push(S,a[i]);            }            else if(compare(a[i])>compare(*(S.top-1)))//优先级大或者是括号。但此刻考虑左括号没有意义            {                if(a[i]==')')//括号不进栈.不参与后缀式的构成                {                    while(*(S.top-1)!='(')                    {                        exp[num++]=*(S.top-1);                        pop(S,e);                    }                    pop(S,e);//将左括号pop走                }                else                    push(S,a[i]);            }            else//优先级小比栈顶元素小            {                if(*(S.top-1)=='(')                {                    push(S,a[i]);                }                else                {                    exp[num++]=*(S.top-1);                    pop(S,e);                    push(S,a[i]);                }            }        }    }    while(!isempty(S))//非空栈时,将元素全弹出,并赋值于exp[]    {        exp[num++]=*(S.top-1);        pop(S,e);    }    for(int i=0;i<strlen(exp);i++)    {        printf("%c",exp[i]);    }    printf("\n");    return 0;}
阅读全文
0 0