基础数据结构——栈

今天介绍栈

栈是什么

栈是只能在某一端插入数据或者删除数据的线性表
可能有的人不知道线性表是什么,线性表其实就是一个长条

这样式儿的,在线性表里,除了第一个和最后一个元素,其他元素都首尾相连,为什么我要说线性表呢,因为栈可以抽象成这样
在这里插入图片描述
一个木桶状的东西,它只能在一端进行删除和插入操作,也就是这样
在这里插入图片描述
在这里插入图片描述
它也就只能在头部进行操作,就像洗澡时把衣服一件一件脱进塑料桶里,然后洗衣服时只能从最上头开始拿一样,这就是栈了

栈的定义和操作

c++给我们提供了标准的栈结构定义方式如下

#include<stack>
using namespace std;
int main()
{
	stack <int> a;
}

头文件为stack,这样我们就定义了一个叫a的栈,如果我们要把一个数据压进去该怎么做呢

#include<stack>
using namespace std;
int main()
{
	stack <int> a;
	a.push(1);
}

这样我们就把一个1压进了这个叫a的栈中
它还有如下操作

#include<stack>
using namespace std;
int main()
{
	stack <int> a;
	a.push(1);//将括号内的元素加入栈中,又叫压栈 
	a.pop();//将栈顶部的元素删除,又叫出栈,弹栈 
	a.top();//调用这个函数会返回栈最顶部的元素 
	int b=a.top();//这样我们就把1存入了b中 
	a.empty();//检查这个栈是不是空的,如果是空的返回1,不然返回0
	while(!a.empty())
	{
		a.pop();
	} //所以我们可以这么操作,如果栈不是空的,那么就弹出栈顶元素,这样就能清空这个栈 
}

都是常用操作
如果嫌操作性太低可以自己手打栈,如果知道要存多少数据,开一个大一点的数组,然后用一个top指向头部,如果有新的数据要加进去,就把它赋值进数组,然后top++,有数据要弹出去,直接top–就好了,至于为什么不把它赋值为0,很明显,当你下次加入新数据的时候会直接覆盖掉它,那为什么还要多此一举去删除它呢

实战演练

熟悉了操作就可以去做题适应一下啦
洛谷P1739
这题的思路很简单,把左括号压栈,右括号来了就出栈
因为标准栈的操作都用代码给出了,所以这里就给一个手打栈的代码吧

#include<bits/stdc++.h>
using namespace std;
string a;
int main()
{
	cin>>a;//cin是string的好朋友 
	char z[300];//栈 
	int top=0;//指向栈头部的指针
	int i=0; //i是什么用的我不用多说了吧 
	while(a[i]!='@')//当存进去的一串数没有结束时 
	{
		if (a[i]=='(')//碰见左括号就把它压栈等待右括号拯救它 
		{
			z[top]='(';
			top++;
		}
		if (a[i]==')')//一个右括号匹配一个左括号 
		{
			if(top>0)//之所以要做这个判断是因为如果给的序列是)))这样就会数组越界了 
			{
				top--;
			}
			else if (top<=0)//所以越界了就直接返回NO就行了 
			{
				cout<<"NO";
				return 0; 
			}
		}
		i++;//继续匹配下一个 
	}
	if (top!=0)cout<<"NO";//如果top不等于0说明里面还有左括号没有匹配 
	else cout<<"YES";//等于0说明都匹配成功了 
}
//其实这道题根本不用开z这个栈,不信你去掉这个栈,它还是能ac,不过加上这个栈更能了解栈的思想 

另:关于栈我很早之前写过一篇,但是那篇写的太差劲了,所以就干脆重写了一遍

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值