逆波兰表达式
编程思路
我们可以输入一段逆波兰表达式,然后程序循环读取单个字符,判断字符是数字范围的还是计算符。当读到的是数字范围时我们将其入栈,当读到的是计算字符我们将前面的两个数Pop出来进行对应的计算,最后再将其入栈。
Demo1实现代码
#include <stdio.h>
#include <stdlib.h>
#define MAX_NUM_STACK 10
#define error 0
#define ok 1
#define MAX_SIZE 10
typedef double ElemType;
typedef int Status;
typedef struct stack{
ElemType *top;
ElemType *base;
int stackSize;
}Stack,*stackList;
Status Pop(Stack *stack,ElemType *e){
if(stack->top==stack->base){
printf("栈空空如也!\n");
return error;
}
*e=*(--stack->top);
stack->stackSize++;
return ok;
}
Status Push(Stack *stack,ElemType e){
if(stack->stackSize<=0)
stack->top=(ElemType *)malloc(sizeof(ElemType)*MAX_NUM_STACK);
if(!stack->top)
return error;
*stack->top=e;
stack->top++;
stack->stackSize--;
return ok;
}
Status InitStack(Stack *stack){
stack->base=(ElemType *)malloc(sizeof(ElemType)*MAX_NUM_STACK);
if(!stack->base)
return error;
stack->top=stack->base;
stack->stackSize=MAX_NUM_STACK;
return ok;
}
void PrintTitle(char*title,char*name,char*date){
printf("---------------------%s----------------------------------\n",title);
printf("\n");
printf("作者:%s\n",name);
printf("日期:%s\n\n",date);
printf("----------------------------------------------------------\n");
}
int main(int argc, char *argv[]) {
PrintTitle("逆波兰计算器","Changlon","2019-12/19"); //程序信息
Stack stack;
int s=InitStack(&stack); //初始化栈内存
if(!s){
printf("内存出错!");
return 0;
}
char in; //每次接受一个字符
char buffer[MAX_SIZE]; //定义字符串缓冲区
int i=0;
double c1,c2;
double e; //最终要输出的计算值
printf("请输入一段逆波兰表达式 (以#结束):");
scanf("%c",&in);
while(in!='#'){
switch(in){
//当检测到计算符时,取出前面两个数进行计算,并入栈
case '+':
Pop(&stack,&c1);
Pop(&