栈实现表达式计算
Posted 梦西空
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了栈实现表达式计算相关的知识,希望对你有一定的参考价值。
#include<stdio.h>//栈的顺序结构
#include<string.h>
#include<stdlib.h>
#include<math.h>
#define sm 20
#define stacklen(x) (x->top-x->base)//计算栈的数据长度
typedef int typelect;
const int MAX=20;
char input[MAX];
//定义
typedef struct
typelect *base;
typelect *top;
int size;
sqstack;
//初始化一个栈
void initstack(sqstack *s)
s->base=(typelect *)malloc(sm*sizeof(typelect));
s->top=s->base;
s->size=sm;
//给栈插入数据
void push(sqstack *s,typelect e)
if(stacklen(s)>=s->size)
s->base=(typelect *)realloc(s->base,(s->size+10)*sizeof(typelect));
*(s->top)=e;
s->top++;
//将数据提出来给e (出栈)
int pop(sqstack *s,typelect *e)
if(s->top==s->base)//栈为空栈
return 0;
*e=*(--s->top);
return 1;
void calculate(sqstack *s1,int a)
int e1,e2;
pop(s1,&e2);
pop(s1,&e1);
switch(a)
case 42:e1=e1*e2;break;
case 43:e1=e1+e2;break;
case 45:e1=e1-e2;break;
case 47:e1=e1/e2;break;
push(s1,e1);
int bd1(sqstack *s)
if(!stacklen(s))
return 0;
switch(*(s->top-1))
case 40:
case 43:
case 45:return 0;
case 42:
case 47:return 1;
int dod(sqstack *s1,int d)
int i,sum=0;
for(i=0;(input[d+i]>='0')&&(input[d+i]<='9');i++)
sum*=10;
sum=sum+input[d+i]-48;
push(s1,sum);
return i-1;
int pd2(sqstack *s2)
if(stacklen(s2))
if(*(s2->top-1)==40)
return 0;
return 1;
return 0;
int main()
sqstack *s1,*s2;
s1=(sqstack *)malloc(sizeof(sqstack));//数字栈
s2=(sqstack *)malloc(sizeof(sqstack));//运算符栈
initstack(s1);initstack(s2);
typelect test,e,e1,e2;
printf("请输入不含等号,空格的算术表达式(表达中的括号为英文的括号):");
scanf("%s",input);
int i,j;
for(i=0;input[i]!='\\0';i++)
switch(input[i])
case '+':
case '-':
while(pd2(s2))
pop(s2,&e);
calculate(s1,e);;
push(s2,(int)input[i]);break;
case '*':
case '/':while(bd1(s2))
pop(s2,&e);
calculate(s1,e);;
push(s2,(int)input[i]);break;
case '(':push(s2,(int)('('));break;
case ')':pop(s2,&e);
while(e!=40)
calculate(s1,e);
pop(s2,&e);;
break;
default :i+=dod(s1,i);
while(stacklen(s2))
pop(s2,&e);
calculate(s1,e);
printf("结果为:%d",*(s1->base));
以上是关于栈实现表达式计算的主要内容,如果未能解决你的问题,请参考以下文章