C++数据结构之栈的应用2:逆波兰表达式

C++数据结构之栈的应用2:逆波兰(后缀)表达式

1.什么是逆波兰表达式

逆波兰表达式又叫做后缀表达式。在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,这种表示法也称为中缀表示。波兰逻辑学家J.Lukasiewicz于1929年提出了另一种表示表达式的方法,按此方法,每一运算符都置于其运算对象之后,故称为后缀表示。
---------来自百度百科

用表达式来解释是这样的:

原始后缀表达式
a+ba b +
a+(b+c)*da b c + d * +

    结合栈的知识,理解起来也不难,以表格遇到数据先压栈,遇到符号出栈。
    使用逆波兰表达式,正是计算机所喜欢的,不需要考虑优先级,大大节省了计算时间。

#include <iostream>
#include <stdlib.h>

#define STACK_INIT_SIZE 100
#define ADD 10
using namespace std;

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

void initstack(sqStack *s)
{
	s->base = (char*)malloc(STACK_INIT_SIZE*sizeof(char));
	if (!s->base)
	{
		exit(0);
	}
	s->top = s->base;
	s->stackSize = STACK_INIT_SIZE;
}
void push(sqStack *s,char data)
{
	if ( s->top - s->base >= s->stackSize)
	{
		s->base = (char *)realloc(s->base,(s->stackSize+ADD)*sizeof(char));
		if (!s->base)
		{
			exit(0);
		}
		s->top = s->base + s->stackSize;
		s->stackSize += ADD;
	}
	*s->top = data;
	s->top++;
}
void pop(sqStack *s,char &data)
{
	if (s->base == s->top)
		cout << "栈满了"<< endl;
	else
	{
		data = *--s->top;
	}
}
int getlen(sqStack s)
{
	return(s.top - s.base);
}

void print(sqStack s)
{
	char e;
	int len = getlen(s);
	for (int i = 0; i< len;i++)
	{
		pop(&s,e);
		cout << e ;
	}
	cout << endl;
}

int main()
{
	char a,b,c;
	int d;

	sqStack s;
	initstack(&s);
	cout << "按后缀表达式的格式输入:"<<endl;
	while(1)
	{
		cin >> c;
		if (c == '#')
			break;
		else
		{
			switch(c)
			{
			case '+':
				pop(&s,a);
				pop(&s,b);
				push(&s,a+b);
				break;
			case '-':
				pop(&s,a);
				pop(&s,b);
				push(&s,b-a);
				break;
			case '*': 
				pop(&s,a);
				pop(&s,b);
				push(&s,a*b);
				break;
			case '/':
				pop(&s,a);
				if (0 == a)
					cout <<"错误,除数为0"<<endl;
				else
					pop(&s,b);
				push(&s,b/a);
				break;
			default:
				push(&s,c);
				break;
			}
		}
	}
	char result;
	pop(&s,result);
	cout <<  result-0 <<endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值