您的位置:首页 > 理论基础 > 数据结构算法

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

2016-08-03 14:15 246 查看


这道题的算法思想就是:先定义运算符的优先级;然后,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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: