啊。栈就是桶装的可比克,无论是你拿一片出来吃,还是舔了一片又放进去,你只能从他的顶部的那一片进行操作。
在c++的STL中有非常方便、高效的栈容器stack。一般我们直接用就好了。如果想用c自己实现的话,最后会贴出。
STACK
基本操作
#include <stack> //需要添加头文件
stack<int> st; //定义类型
stack<double> st2;
st.push(); // 栈顶增加元素
st.pop(); // 栈顶移除元素
st.top(); // 输出栈顶元素
st.empty(); // 当栈空时,返回true
st.size(); // 返回栈中元素个数
来个题看看
原题传送门
这是最基本的双栈操作,一个放数字,一个放操作符。当然这道题比较简单也没有括号,可以用一个栈,甚至不用栈都可以解,百度应该有答案的,双栈利于理解栈的内容。
#include<iostream>
#include<cstdio>
#include<stack>
using namespace std;
int main()
{
double m1;
char m2;
double sum=0;
stack<double> s1;
stack<char> s2;
while(cin>>m1)
{
m2=getchar();
if(m2==' ')
m2=getchar(); //处理空格
if(m1==0&&m2=='\n')
break;
s1.push(m1),s2.push(m2);
while(1)
{
cin>>m1;
if(m2=='-') //处理减号
m1=-m1,s2.pop(),s2.push('+');
m2=getchar();
if(m2==' ')
m2=getchar();
if(s2.top()=='+'||s2.top()=='-')
{
if(m2!='\n') //每次都要判断是不是最后一次操作了
s1.push(m1),s2.push(m2);
else
s1.push(m1);
}
else if(s2.top()=='*')
{
if(m2=='\n')
s1.top()*=m1,s2.pop();
else
s1.top()*=m1,s2.pop(),s2.push(m2);
}
else if(s2.top()=='/')
{
if(m2=='\n')
s1.top()/=m1,s2.pop();
else
s1.top()/=m1,s2.pop(),s2.push(m2);
}
if(m2=='\n')
break;
}
sum=s1.top();
s1.pop();
while(!s1.empty()&&!s2.empty())
{
if(s2.top()=='+')
sum+=s1.top();
else if(s2.top()=='*')
sum*=s1.top();
else
sum=s1.top()/sum;
s1.pop(),s2.pop();
}
printf("%.2f\n",sum);
}
return 0;
}