利用栈计算逆波兰表达式

栈:

一种后进先出(LIFO)的数据结构

实现栈需要:数组+指向栈顶的普通变量(可以看成手指,或者是指针)

数组 a 和变量 top:

元素 1 准备入栈:

 top往前移动一位,放进去 1 :

元素 2 入栈,同理:

 

接下来,出栈,根据规则,只能是栈顶元素(即top指向元素)出栈:

 返回top所指元素即可,但记得要把top往后移动一位。

所以栈有两个基本操作函数:

入栈:

 

出栈:

于是我们根据栈的特性,来写上一题逆波兰表达式的代码:

#include<iostream>
using namespace std;

const int maxn=100;
int a[maxn];
int top;

//把x压入栈
void push(int x)
{
	top++;
	a[top]=x;
}

//弹出栈顶元素
int pop()
{
	top--;
	return a[top+1];
}

//字符串转换为数字 
int trans(string s)
{
	int sum=0;
	for(unsigned int i=0; i<s.length(); i++)
	{
		sum=sum*10+s[i]-'0';
	}
	return sum;
}



int main()
{
	top=0;//把栈给清空。(但实际内存中还有) 
	string temp;
	int a,b;
	while(cin>>temp)
	{
		if(temp=="+")
		{
			a=pop();
			b=pop();
			push(a+b);
		}
		else if(temp=="-")
		{
			a=pop();
			b=pop();
			push(b-a);
		}
		else if(temp=="*")
		{
			a=pop();
			b=pop();
			push(a*b);
		}
		else//那就是数字了
		{
			int num=trans(temp);//把字符串变成数字
			push(num);
		}	
	}
	cout<<pop()<<endl;

	
	
	return 0;
}

运行结果:

下一篇讲一下实战中使用栈。 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值