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

来源:互联网 发布:吉利知豆d2多少钱 编辑:程序博客网 时间:2024/06/06 05:44


这道题的算法思想就是:先定义运算符的优先级;然后,1、设定运算符栈;2、将栈底元素设为'#';3、扫描表达式,若当前字符是操作数,则直接把它发送给后缀表达式;4、若当前字符为运算符且优先级大于栈顶运算符,则进栈,否则退出栈顶运算符并将其发送给后缀式。然后将当前运算符放入栈中;5、若当前字符是结束符,则将栈中的全部运算符依次发送给后缀式。6、若当前字符为"(",进栈;7、若当前字符为")",则从栈顶起,依次将栈中运算符出栈发送给ie后缀式,直到碰到"("。将栈中"("出栈,不需要发送给后缀式。然后继续扫描表达式。

代码如下:

#include <stdio.h>
#include <malloc.h>
#define maxsize 100
typedef struct{/*栈的定义*/
    char data[maxsize];
    int top;
}Seqstack;
Seqstack *Initstack(){/*初始化栈*/
    Seqstack *s;
    s=malloc(sizeof(Seqstack));
    s->top=0;
    s->data[0]='#';
    return s;
}
int compare(char p){/*定义运算符的优先级*/
    if(p=='#')
        return 0;
    if(p=='(')
        return 1;
    if(p=='+'||p=='-')
        return 2;
    if(p=='*'||p=='/')
        return 3;
}
Seqstack *Pushstack(Seqstack *s,char p){/*入栈函数*/
    if(s->top==maxsize-1)
        printf("overflow!");
    s->top++;
    s->data[s->top]=p;
    return s;
}
int main(){
    Seqstack *s;
    s=Initstack();
    char p;
    char q[100];
    int i,j;
    i=0;
    while(scanf("%c",&p)!=EOF){
        if (p>='A'&&p<='z'){
            q[i]=p;
            i++;
        }
        else if(p=='+'||p=='-'||p=='*'||p=='/'){
              if(compare(p)>compare(s->data[s->top])){
                s=Pushstack(s,p);
              }
              else{
                q[i]=s->data[s->top];
                i++;
                s->data[s->top]=p;
              }
        }
        else if(p=='#'){
            while(s->data[s->top]!='#'){
                q[i]=s->data[s->top];
                i++;
                s->top--;
            }
            break;
        }
        else if(p=='(')
            s=Pushstack(s,p);
        else if(p==')'){
            while(s->data[s->top]!='('){
                q[i]=s->data[s->top];
                i++;
                s->top--;
            }
            s->top--;
        }
    }
    for(j=0;j<i;j++)
        printf("%c",q[j]);
    return 0;
}

0 0
原创粉丝点击