#数据结构:栈的应用之表达式求值(C)
#Day1
编写程序,实现算术表达式求值:
设操作数:0,1,2,……,8,9(可扩充);(敲重点,这最大计算两位数(小白))
算符:+,-,*,/,(,),#(#号为开始和结束符)。
输入格式:
一行数据,一个正确的算术表达式。
输出格式:
表达式求值后结果。
输入样式:8+(9/3-1)#
输出样式:10
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define Stacksize_S 30
#define Increase_Stack 20
typedef int Status;
typedef int SElemType;
typedef struct SNode{
SElemType *base;
SElemType *top;
int Stacksize;
}SNode,*LinkSNode;
void InitStack(SNode &S)//创建顺序栈
{
S.base=(SElemType*)malloc(Stacksize_S*sizeof(SElemType));
S.top=S.base;
S.Stacksize=Stacksize_S;
}
void Push(SNode &S,SElemType e)//入栈操作
{
if(S.top-S.base>=S.Stacksize)
{
SElemType* p;
p=(SElemType*)realloc(S.base,(Stacksize_S+Increase_Stack)*sizeof(SElemType));
S.base=p;
if(!S.base) exit(ERROR);
}
*S.top++=e;
}
bool Pop(SNode &S,SElemType &e)//出栈
{
if(S.base==S.top) return false;
else
e=*--S.top;
return true;
}
int GetStack(SNode &S,SElemType &e)//读取栈顶元素
{
if(S.base==S.top) return ERROR;
else
{
e=*(S.top-1);
return e;
}
}
char StackCompare(SElemType e,SElemType c)//运算符优先级比较
{
char compare;
switch(e)
{
case ')':
if(c=='(')
{
printf("输入语法错误!");
exit(ERROR);
}
else
{
compare='>';
}
break;
case '/':
case '*':
if(c=='(')
{
compare='<';
}
else
{
compare='>';
}
break;
case '+':
case '-':
if(c=='(' || c=='/' || c=='*')
{
compare='<';
}
else
{
compare='>';
}
break;
case '(':
if(c==')')
{
compare='=';
}
else if(c=='#')
{
printf("输入语法错误!");
exit(ERROR);
}
else
{
compare='<';
}
break;
case '#':
if(c=='#')
{
compare='=';
}
else if(c==')')
{
printf("输入语法错误!");
exit(ERROR);
}
else
{
compare='<';
}
break;
}
return compare;
}
bool In(char c)//判断c是否为运算符
{
switch (c)
{
case'+':
case'-':
case'*':
case'/':
case'(':
case')':
case'#':
return true;
break;
}
return false;
}
int J_S(SElemType e,SElemType k1,SElemType k2)//计算k1?k2的值
{
SElemType k;
switch(e)
{
case '+':k=k2+k1;break;
case '-':k=k2-k1;break;
case '*':k=k2*k1;break;
case '/':k=k2/k1;break;
default:exit(ERROR);
}
return k;
}
int Opreation(SNode &S1,SNode &S2)//S1为运算符栈,S2为操作数栈
{
char c;
SElemType *kk;
SElemType e,k1,k2,k;
int num=0,flag=0;
Push(S1,'#');
c=getchar();
while(c!='#'||GetStack(S1,e)!='#')
{
if(!In(c))
{
num = c-'0' ;
Push(S2,num);
c=getchar();
if('0'<=c&&c<='9')
{
Pop(S2,e);
num=num*10+(c-'0');
Push(S2,num);
num=0;
c=getchar();
}
}
else
switch (StackCompare(GetStack(S1,e),c))//比较优先级
{
case'<'://新输入的算符优先级高,c进栈
Push(S1,c);c=getchar();break;
case'='://脱去括号,接受下一个字符
Pop(S1,e);c=getchar();break;
case'>'://新输入的算法优先级低,栈顶元素优先权高
Pop(S1,e);
Pop(S2,k2);Pop(S2,k1);
Push(S2,J_S(e,k2,k1));
//c=getchar();
break;
}
}
return (GetStack(S2,e));
}
int main()
{
SNode S1,S2;
InitStack(S1);//创建栈,S1为运算符栈,S2为操作数栈
InitStack(S2);
printf("%d \n",Opreation(S1,S2));
return OK;
}
正在学习数据结构的小白一枚(记录一下)嘻嘻