今天我们来学习栈,坦白的说,一开始学栈真的一头雾水,还带一种对未知知识的害怕,不敢去学,这种害怕很多时候阻挡了我的进步。第一次上完有关栈的课,我只记住了:栈不是一个特有的东西,只是一个思想。即使做4.5道例题时,我脑子也没有这个概念,后面做到第6题时候我才开始有所感悟,先进后出。接下来让我们看几个图。
这个就是栈的模型图,第一个数a1来了放进去,要把栈里的数字拿出来,只能从栈顶也就是头开始拿。这就是栈,看上去很简单,然后我们来看题目吧。
其实就是逆序输出一个数组,那不就和我们的栈的概念相同吗?如果不是0压入栈,是0就终止输入,最后反序输出。让我们来看一下代码吧。
从a1开始存进去,不就是相当于一个栈,往里面压东西进去吗?然后从最后一项开始输出.非常的简单然后我们来看下一题。
这是一题模拟题,
#include<bits/stdc++.h>
using namespace std;
string a[1000005],x;
bool isEmpty(int top)
{
return top==-1;
}
void push(string &x,int &top)
{
a[++top]=x;
}
string pop(int &top)
{
if (isEmpty(top)) return cout << "Empty\n", "";
return a[top--];
}
void query(int &top)
{
cout<<(isEmpty(top)?"Anguei!":a[top])<<"\n";
}
void size(int &top)
{
cout<<top+1<<"\n";
}
int main()
{
int t,n,x;
cin>>t;
string s;
while(t--)
{
int top=-1;
cin>>n;
while(n--)
{
cin>>s;
string x;
if(s=="push")
{
cin>>x;
push(x,top);
}else if(s=="pop")
{
pop(top);
}else if(s=="query")
{
query(top);
}else if(s=="size")
{
size(top);
}
}
}
return 0;
}
代码比较长,定义出不同的自定义函数,来处理这些,非常的常规。让我们来看一些难题吧.
好吧下一题也不是很难。
#include<bits/stdc++.h>
using namespace std;
int main()
{
string a;
cin>>a;
int cnt1=0;
for(int i=0;i<a.length();i++)
{
if(a[i]=='(')
{
cnt1++;
}
if(a[i]==')')
{
cnt1--;
}
if(cnt1<0)
{
cout<<"NO"<<"\n";
return 0;
}
}
if(cnt1>0)
{
cout<<"NO"<<"\n";
return 0;
}
cout<<"YES"<<"\n";
return 0;
}
思路非常简单粗暴,如果是左括号就加1,可以理解成入栈,是右括号就出栈,那就是减一。如果在这个过程之中cnt1也就是计数器小于0了,那两个符号就不匹配了,所以就输出然后终止程序,还有一种错误的情况就是,左括号过多了,那么cnt1也就是计算器比0大,那么我们也判断它是错误的,两个判断就结束了。ok,我们来看下一题。
这个题也是典型栈的题目
但是注意这个题目是输出最后4位,那就mod10的四次方
#include<bits/stdc++.h>
using namespace std;
int b[2000005];
const int mod = 1e4;
int main()
{
char k;
int x,a,top=-1,res=0,ans=0;
cin>>x;
b[++top]=x;
while(cin>>k>>a)
{
if(k=='*')
{
res=(b[top]*a%mod)%mod;
b[top]=res;
}else{
b[++top]=a;
}
}
while(top!=-1)
{
ans+=b[top--]%mod;
}
cout<<ans%mod<<"\n";
return 0;
}
只会有+号和*号,我们先考虑*,把每一个a*b存在栈之中,然后再把栈中元素每个元素相加,对于mod的,是同余定理,就是一个数mod另外一个数,无论mod几次的结果都是一样的。然后就是一些细节注意一下。
再看下一题
以字符串ans做栈,出现了ABC那我们就删除栈中的这些元素,最输出结果。
#include<bits/stdc++.h>
using namespace std;
int main()
{
char ch;
string ans;
while(cin>>ch)
{
ans+=ch;
if(ans.size() >= 3 && ans.substr(ans.size()-3) == "ABC")
{
ans.erase(ans.end()-3, ans.end());
}
}
cout<<ans<<"\n";
return 0;
}