在上一篇中我们讲了如何用栈的基本构架。
但在实战中,或者算法竞赛中,往往利用已经封装好的 “stack” 库来使用栈,毕竟,bug往往就产生在你觉得OK的代码之上。
stack中有6中基本操作:
①bool empty();
如果当前堆栈为空,empty() 函数 返回 true 否则返回false.
②void pop();
pop() 函数移除堆栈中最顶层元素。
③void push( const TYPE &val );
push() 函数将 val 值压栈,使其成为栈顶的第一个元素。
④size_type size();
size() 函数返当前堆栈中的元素数目。
⑤TYPE &top();
top() 函数返回对栈顶元素的引用。
⑥“==” “<=” “>=” “<” “>” "!="
所有的这些操作可以被用于栈. 相等指栈有相同的元素并有着相同的顺序。
根据这些,我们可以很容易的写出逆波兰表达式的代码:
#include<iostream>
#include<stack> //引入stack容器
using namespace std;
//字符串转换为数字
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()
{
//定义一个栈,里面的元素是int
stack<int> s;
string temp;
int a,b;
while(cin>>temp)
{
if(temp=="+")
{
a=s.top();s.pop();
b=s.top();s.pop();
s.push(a+b);
}
else if(temp=="-")
{
a=s.top();s.pop();
b=s.top();s.pop();
s.push(b-a);
}
else if(temp=="*")
{
a=s.top();s.pop();
b=s.top();s.pop();
s.push(a*b);
}
else//那就是数字了
{
int num=trans(temp);//把字符串变成数字
s.push(num);
}
}
cout<<s.top()<<endl;
return 0;
}
运行结果:
要注意一点,top()是返回栈顶元素,只是返回,
所以一般情况下,top()后面要跟着个pop(),pop()是用来弹出栈顶元素。
Over.