举一个逆波兰表达式的例子吧:
(2+3)(4-6)变成逆波兰表达式就是 2 3 + 4 6 - *
一开始数字入栈
然后遇到加号,将2和3出栈相加的结果在入栈变成
再把4和6入栈遇见减号再把4和6弹出,把4-6结果在入栈,然后遇见乘号 就用5(-2)就是结果了
代码:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<ctype.h>
#define STACK_LEN 20
#define STA 10
#define len 10
typedef double ElemType;
typedef struct Stack{
ElemType *top;
ElemType *base;
int stackSize;
}sqStack;
void InitStack(sqStack *s){ //建栈
s->base=(ElemType *)malloc(STACK_LEN*sizeof(ElemType));
if(s->base==0){
exit(0);
}
s->top=s->base;
s->stackSize=STACK_LEN;
}
void Push(sqStack *s,ElemType e){ //入栈
*(s->top)=e; //注意加括号
s->top++;
if(s->top-s->base>=STACK_LEN){
s->base=(ElemType *)realloc(s->base,(s->stackSize+STA)*sizeof(ElemType));
if(s->base==0){
exit(0);
}
s->stackSize=s->stackSize+STA;
}
}
void Pop(sqStack *s,ElemType *e){ //出栈
if(s->base==s->top){
return;
}
*e=*--(s->top);
}
int stacklen(sqStack s){
return(s.top-s.base);
}
int main(){
sqStack s;
InitStack(&s);
int i=0;
char c;
char str[len]; //缓存区
double d,e,f,h;
printf("输入要计算的表达式,两个数以及符号之间用空格隔开,输入#号结束:\n");
scanf("%c",&c);
while(c!='#')
{
while(isdigit(c)||c=='.')
{
str[i++]=c;
str[i]='\0'; //字符串要加结束符
if(i>=len)
{
printf("所输入的单个数字过大!\n");
return -1;
}
scanf("%c",&c);
if(c==' ')
{
d=atof(str); //这个函数是把字符串变成浮点型数据
Push(&s,d);
i=0; //这里别忘记变成0,一开始没写,结果不对,找了半天的错误
break;
}
}
switch(c)
{
case '+':
Pop(&s,&d);
Pop(&s,&e);
Push(&s,d+e);
break;
case '-':
Pop(&s,&d);
Pop(&s,&e);
Push(&s,e-d);
break;
case'*':
Pop(&s,&d);
Pop(&s,&e);
Push(&s,e*d);
break;
case'/':
Pop(&s,&d);
Pop(&s,&e);
Push(&s,e/d);
break;
}
scanf("%c",&c);
}
Pop(&s,&h);
printf("最后的结果为:%lf",h);
return 0;
}