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

来源:互联网 发布:更改音乐的软件 编辑:程序博客网 时间:2024/05/22 05:21
数据结构实验之栈二:一般算术表达式转换成后缀式
Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^
题目描述
对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。
输入
输入一个算术表达式,以‘#’字符作为结束标志。
输出
输出该表达式转换所得到的后缀式。
示例输入
a*b+(c-d/e)*f#
示例输出
ab*cde/-f*+ 


思路:
     1.是否是字母。是则输出
      2.否。
       (1)是否是栈空。是进栈
       (2)否。
           <1>是否为 )。是输出直到(。
           <2>否。就返回值当前元素是否<栈顶元素&&栈顶元素不为(。是输出栈顶元素&&栈顶元素更新为当前元素。
           <3>否。当前元素进栈。
      # 结束;

      输出直到栈空;


 #include <stdio.h>#include <string.h>#include <stdlib.h>#define maxsize 51typedef char ElemType;typedef struct{    ElemType *base;    ElemType *top;    int Length;} SQ;int Init(SQ &S){    S.base=(ElemType *)malloc(maxsize*sizeof(ElemType));    if(!S.base) exit(-1);    S.top=S.base;    S.Length=maxsize;    return 1;}int push(SQ &S,int e){    *S.top++=e;    return 1;}int pop(SQ &S,ElemType &e){    e=*(--S.top);    return 1;}int com_de(char ch){    if(ch=='+'||ch=='-') return 1;    else if(ch=='*'||ch=='/') return 2;    else if(ch=='(') return 3;    else if(ch==')') return 4;}int get(SQ &S){    char e;    e=*(S.top-1);    return com_de(e);}int Empty(SQ &S){    if(S.top==S.base) return 1;    return 0;}void Clear(SQ &S){    S.top=S.base;}int main(){    ElemType e;    int i;    char f[maxsize];    while(gets(f)!=NULL)    {        SQ S;        Init(S);        for(i=0; f[i]!='#'; i++)        {            if(f[i]>='a'&&f[i]<='z')                printf("%c",f[i]);            else            {                if(Empty(S))                    push(S,f[i]);                else if(com_de(f[i])==4)                {                    while(get(S)!=3)                    {                        pop(S,e);                        printf("%c",e);                    }                    pop(S,e);                }                else if(com_de(f[i])<=get(S)&&get(S)!=3)                {                    pop(S,e);                    printf("%c",e);                    push(S,f[i]);                }                else                    push(S,f[i]);            }        }        while(!Empty(S))        {            pop(S,e);            printf("%c",e);        }        printf("\n");    }}
0 0