栈浅谈(上)

目录

栈的定义

栈的实现 

初始化

判断栈是否为空

 入栈操作

获取栈顶元素

出栈操作

遍历栈

销毁栈

完整代码演示

栈—STL 

基本操作

例题

参考代码


栈的定义

        说到栈,一些不会计算机语言的“小白”(我就是)就会想到栈道之类的词语,我们这里的栈指的是一种计算术语,它是一类数据结构。为什么叫栈呢?(你去问图灵)因为只不过这种数据结构的“外形”和栅栏(栈)有“一”点相似罢了。

        栈其实是一种运算受限的线性表。一种被限定仅在表尾进行插入和删除操作的线性表。只准插入或删除的一端叫做栈顶,而另一端叫做栈底。当一个新的元素放到栈中我们可以把它称为入栈,进栈或压栈,刚刚进去的元素我们把它叫做栈顶元素(注意:只有一个栈最顶端的元素才能被称作栈顶元素)。当栈中的一个元素出去时我们把它称为出栈或退栈(注意:出栈的时候只能栈顶元素出栈)它是把栈顶元素删掉,把与其相邻的元素当做栈顶元素。 是不是有点蒙,画个图你就知道了。

         如果还有点蒙的话,打个比方,栈就像是一个弹夹,将里面放子弹就相当于是进栈,出栈就相当于弹出子弹,先进后出(以后我会再次更新一篇关于队列的博文,队列是先进先出)。

接下来我们再来演示一遍出栈

栈的实现 

初始化

void Initstack(){
    top=-1;
}

判断栈是否为空

bool Empty(){
    if(top==-1){
        return true;
    }else{
        return false;
    }
}//判空函数

 入栈操作

void Push(int s, int x){
    if(top==MaxSize-1){
        cout<<"栈满"<<endl;
        return;
    }
    top++;
}
//入栈操作

获取栈顶元素

int Top(){
    if(top==-1){
        cout<<"栈空"<<endl;
        return -1;
    }else{
        return top;
    }
}//读取栈顶元素

出栈操作

void Pop(){
    if(top==-1){
        cout<<"栈空"<<endl;
        return;
    }
    top--;
}//出栈操作

遍历栈

void PrintStack(){
    while(top!=-1){
        top--;
        cout<<top<<" ";
    }
    cout<<endl;
}//遍历栈

销毁栈

void DestroyStack(){
    top=-1;
}销毁栈

完整代码演示

#include<bits/stdc++.h>
using namespace std;
void Initstack(){
    top=-1;
}//初始化
bool Empty(){
    if(top==-1){
        return true;
    }else{
        return false;
    }
}//判空函数
void Push(int s, int x){
    if(top==MaxSize-1){
        cout<<"栈满"<<endl;
        return;
    }
    top++;
}//入栈操作
int Top(){
    if(top==-1){
        cout<<"栈空"<<endl;
        return -1;
    }else{
        return top;
    }
}//读取栈顶元素
void Pop(){
    if(top==-1){
        cout<<"栈空"<<endl;
        return;
    }
    top--;
}//出栈操作
void PrintStack(){
    while(top!=-1){
        top--;
        cout<<top<<" ";
    }
    cout<<endl;
}//遍历栈
void DestroyStack(){
    top=-1;
}//销毁栈
int main(){
	ios::sync_with_stdio(false);

	return 0;
}


​

其实栈还有另外的表达方式——STL闪亮登场

标准模板库(Standard Template Library,STL)是惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。虽说它主要出现到C++中,但在被引入C++之前该技术就已经存在了很长时间。STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),几乎所有的代码都采用了模板类和模板函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。标准模板库是一个C++软件库,大量影响了C++标准程序库但并非是其的一部分。其中包含4个组件,分别为算法、容器、函数、迭代器。(源自百度百科)

栈—STL 

STL模板里关于栈的函数均已在上面呈现

Tip:在使用STL栈模板的时候要先创建:

#include<stack>//头文件
stack<int>s1;//入栈元素为 int 型
stack<string>s2;//入队元素为string型
stack<node>s3;//入队元素为自定义型

基本操作

push(x);//将x加入栈中,即入栈操作
pop();//出栈操作(删除栈顶),只是出栈,没有返回值
top();//返回第一个元素(栈顶元素)
size();//返回栈中的元素个数
empty();//当栈为空时,返回 true

例题

详见P1739 表达式括号匹配 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

参考代码

​
#include<iostream>
#include<stack>
#define llu unsigned long long
stack <char> s;
using namespace std;
int main(){
	char s1[105];
	while(cin>>s1&&s1!=0){
		int n=strlen(s1);
		for(int i=0;i<n;i++){
			if(s1[i]=='('||s1[i]=='['||s1[i]=='{') s.push(s1[i]);
			else if(s1[i]==')'||s1[i]==']'||s1[i]=='}'){
				if(s.empty())s.push(s1[i]);
				else if(s1[i]==')'&&s.top()=='(') s.pop();
				else if(s1[i]==']'&&s.top()=='[') s.pop();
				else if(s1[i]=='}'&&s.top()=='{') s.pop();
				else s.push(s1[i]);
			}
		}
		if(s.empty())cout<<"yes"<<endl ;
		else cout<<"no"<<endl;
	}
	return 0;
}

今天对于栈的讲解到此结束,我们下一篇博文再见!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cqbzcyy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值