数据结构实验之栈二:一般算术表达式转换成后缀式
来源:互联网 发布:吉利知豆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;
}
- SDUT2132数据结构实验之栈二:一般算术表达式转换成后缀式(栈)
- 数据结构实验之栈二:一般算术表达式转换成后缀式(栈)
- 数据结构实验之栈二:一般算术表达式转换成后缀式(手写栈)
- 数据结构实验之栈二:一般算术表达式转换成后缀式(栈)
- [SDUT](2132)数据结构实验之栈二:一般算术表达式转换成后缀式 ---栈
- 数据结构实验之栈二:一般算术表达式转换成后缀式
- 数据结构实验之栈二:一般算术表达式转换成后缀式
- 数据结构实验之栈二:一般算术表达式转换成后缀式
- 数据结构实验之栈二:一般算术表达式转换成后缀式
- 数据结构实验之栈二:一般算术表达式转换成后缀式
- 数据结构实验之栈二:一般算术表达式转换成后缀式
- SDUT 2132 数据结构实验之栈二:一般算术表达式转换成后缀式
- 数据结构实验之栈二:一般算术表达式转换成后缀式
- SDUT OJ 数据结构实验之栈二:一般算术表达式转换成后缀式
- 数据结构实验之栈二:一般算术表达式转换成后缀式
- SDUT 2132 数据结构实验之栈二:一般算术表达式转换成后缀式
- 数据结构实验之栈二:一般算术表达式转换成后缀式
- 数据结构实验之栈二:一般算术表达式转换成后缀式
- poj1026
- jquery.form.js
- Eclipse从Gitlab中导入工程。
- rabbitmq和kafka
- centos之lnmp 安装
- 数据结构实验之栈二:一般算术表达式转换成后缀式
- 【win32】day01-Windows编程
- 递归之斐波那契数列
- Invitation Cards建立反向边求解最短路
- iOS 获取启动图
- [LeetCode] 83. Remove Duplicates from Sorted List
- SPOJ Two Paths(树形dp,最大不相交路径长度乘积)
- JSON.parse与JSON.stringify
- offsetwidth/offsetheight的区别