1. 程式人生 > 其它 >棧實現表示式計算

棧實現表示式計算

技術標籤:演算法學習資料結構

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