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

逆波兰表达式

对于(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 
#include
#include
#include

#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;
}

你可能感兴趣的:(数据结构,算法学习笔记)