#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#define OK 1
#define ERROR 0
#define STACK_INIT_SIZE 20
#define STACK_INCREMENT 10
#define DIGITBUFFER 10
typedef int Status;
typedef double Elemtype;
typedef struct StackNode{
Elemtype* base;
Elemtype* top;
int stackSize;
}StackNode;
typedef struct StackNode* Stack;
Status InitStack(Stack s){
s->base = (Elemtype*)malloc(sizeof(Elemtype) * STACK_INIT_SIZE);
if(!s->base)
return ERROR;
s->top = s->base;
s->stackSize = STACK_INIT_SIZE;
return OK;
}
Status Pop(Stack s,Elemtype* result){
if(s->base == s->top)
return ERROR;
*result = *(--s->top);
return ERROR;
}
Status Push(Stack s,Elemtype value){
if(s->top - s->base == s->stackSize){
s->base = (Elemtype*)realloc(s->base,sizeof(Elemtype) * (STACK_INIT_SIZE + STACK_INCREMENT));
if(!s->base)
return ERROR;
s->top = s->base + STACK_INIT_SIZE;
s->stackSize = STACK_INIT_SIZE + STACK_INCREMENT;
}
*(s->top) = value;
s->top++;
return OK;
}
int StackLenth(Stack s){
return s->top - s->base;
}
Status RPT(){ //reverse polish notation
char c;
double operater1,operater2;
double result;
int i = 0;
char bufferDigit[DIGITBUFFER];
Stack s;
InitStack(s);
printf(" Please Enter Reverse Polish Notation!(RPN)\n");
printf("------note: separated by space between -------\n");
printf("------ number or operator.end of '#'-------\n");
scanf("%c", &c);
while(c != '#'){
/* 处理输入的数字:由于使用%c接受输入,所以对于123这样的多位数的
* 输入%c是不能处理的。所以设置了char型的数组bufferDigit来缓存输
* 入的多位数。在开始了多位数的输入之后,必将以空格来结束该多位数
* 输入,所以if(c == ' ')用来判断多位数的结束。以便将缓存在char
* 型数组中的多位数转化为double并且Push。
*/
while( isdigit(c) || c == '.'){
if(i == 10){
printf("number is too lager\n");
return ERROR;
}
bufferDigit[i++] = c;
bufferDigit[i] = '\0';
scanf("%c", &c);
if(c == ' '){ //不是空格就一定还是数字
result = atof(bufferDigit);
Push(s,result);
i = 0;
}
}
/* 处理输入的运算符
*/
switch(c){
case '+':
Pop(s,&operater1);
Pop(s,&operater2);
Push(s,operater1 + operater2);
break;
case '-':
Pop(s,&operater1);
Pop(s,&operater2);
Push(s,operater2 - operater1);
break;
case '*':
Pop(s,&operater1);
Pop(s,&operater2);
Push(s,operater1 * operater2);
break;
case '/':
Pop(s,&operater1);
Pop(s,&operater2);
Push(s,operater2 / operater1);
break;
}
scanf("%c", &c);
}
Pop(s,&result);
printf("The result of RPN is %f\n",result);
}
//test;
Status ShowStack(Stack s){
while(s->base != s->top){
printf("%f ",*(--(s->top)));
}
printf("\n");
}
Status Test(){
Stack s1;
InitStack(s1);
Push(s1,1);
Push(s1,2);
Push(s1,3);
ShowStack(s1);
}
int main(){
RPT();
Stack s;
InitStack(s);
Push(s,1);
Push(s,2);
Push(s,3);
ShowStack(s);
return 0;
}
栈应用之使用逆波兰输入求表达式的值
最新推荐文章于 2022-11-07 21:59:18 发布