warehouse

今天我们来学习栈,坦白的说,一开始学栈真的一头雾水,还带一种对未知知识的害怕,不敢去学,这种害怕很多时候阻挡了我的进步。第一次上完有关栈的课,我只记住了:栈不是一个特有的东西,只是一个思想。即使做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;
}
  • 21
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值