棧實現表示式計算
阿新 • • 發佈:2020-12-13
#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));
}