栈实现表达式计算

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));


以上是关于栈实现表达式计算的主要内容,如果未能解决你的问题,请参考以下文章

关于栈实现综合计算器的代码实现和讲解

栈实现综合计算器(中缀表达式),前缀,中缀,后缀表达式,逆波兰计算器

算法栈实现综合表达式计算

数据结构和算法使用栈实现综合计算器

后缀表达式(逆波兰表达式)的计算---栈实现

用调度场算法计算表达式的值,javascript实现