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

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

2017-09-28 23:02 323 查看

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

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 0
typedef 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 数据结构
相关文章推荐