您的位置:首页 > 理论基础 > 数据结构算法

数据结构与算法笔记 lesson 11 逆波兰计算器

2016-12-04 09:17 661 查看

逆波兰表达式

对于(1-2)*(4-5),用逆波兰表示法,应该是1 2 - 4 5 + *

数字1 和 2 进栈,遇到减号运算符则弹出两个元素进行运算并把结果入栈

数字4 和 5 入栈,遇到加号运算符,4和5出栈,并把结果入栈

又遇到乘法,将9和-1弹出栈进行乘法计算,此时栈空并无数据压栈,-9位最终运算结果 

实现对逆波兰输入的表达式进行计算

支持带小数点的数据

正常表达式 --- > 逆波兰表达式

 a + b --- >  a  b  + 

 a+(b-c)  ----> a b c - +

 a+(b-c) *d ----> a b c  -  d * +

 a+ d*(b-c) ----> a d b c - * +

#include <stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<math.h>

#define STACK_INIT_SIZE 20
#define STACKINCREMENT 10
#define MAXBUFFER 10

typedef double ElemType;

typedef struct
{
ElemType *base;
ElemType *top;
int stackSize;
}sqStack;

void InitStack(sqStack *s)
{
s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
if (!s->base)
exit(0);
s->top = s->base;
s->stackSize = STACK_INIT_SIZE;
}

void Push(sqStack *s, ElemType e)
{
if (s->top - s->base >= s->stackSize)
{
s->base = (ElemType*)realloc(s->base, (s->stackSize + STACKINCREMENT) * sizeof(ElemType));
if (!s->base)
exit(0);
}
*(s->top) = e;
s->top++;
}

void Pop(sqStack *s, ElemType *e)
{
if (s->top == s->base)
return;
*e = *--(s->top);
}

int StackLen(sqStack s)
{
return (s.top - s.base);
}

int main()
{
sqStack s;
char c;
double d, e;
char str[MAXBUFFER];
int i = 0;

InitStack(&s);
printf("请按逆波兰表达式输入待以计算数据,数据与运算符用空格隔开,以#作为结束表示:\n");

scanf("%c", &c);
while (c != '#')
{
while (isdigit(c) || c == '.')
{
str[i++] = c;
str[i] = '\0';
if (i >= MAXBUFFER)
{
printf("出错,输入的数据过大\n");
return -1;
}
scanf("%c", &c);
if (c == ' ')
{
d = atof(str);
Push(&s, d);
i = 0;
break;
}
}
switch (c)
{
case '+':
Pop(&s, &e);
Pop(&s, &d);
Push(&s, d + e);
break;
case '-':
Pop(&s, &e);
Pop(&s, &d);
Push(&s, d - e);
break;
case '*':
Pop(&s, &e);
Pop(&s, &d);
Push(&s, d * e);
break;
case '/':
Pop(&s, &e);
Pop(&s, &d);
if (e != 0)
Push(&s, d / e);
else
printf("\n出错,除数为零!\n");
break;
}
scanf("%c", &c);
}
Pop(&s, &d);
printf("最终的结果为%f\n", d);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: