目录
栈的定义
说到栈,一些不会计算机语言的“小白”(我就是)就会想到栈道之类的词语,我们这里的栈指的是一种计算术语,它是一类数据结构。为什么叫栈呢?(你去问图灵)因为只不过这种数据结构的“外形”和栅栏(栈)有“一”点相似罢了。
栈其实是一种运算受限的线性表。一种被限定仅在表尾进行插入和删除操作的线性表。只准插入或删除的一端叫做栈顶,而另一端叫做栈底。当一个新的元素放到栈中我们可以把它称为入栈,进栈或压栈,刚刚进去的元素我们把它叫做栈顶元素(注意:只有一个栈最顶端的元素才能被称作栈顶元素)。当栈中的一个元素出去时我们把它称为出栈或退栈(注意:出栈的时候只能栈顶元素出栈)它是把栈顶元素删掉,把与其相邻的元素当做栈顶元素。 是不是有点蒙,画个图你就知道了。
如果还有点蒙的话,打个比方,栈就像是一个弹夹,将里面放子弹就相当于是进栈,出栈就相当于弹出子弹,先进后出(以后我会再次更新一篇关于队列的博文,队列是先进先出)。
接下来我们再来演示一遍出栈
栈的实现
初始化
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;
}
今天对于栈的讲解到此结束,我们下一篇博文再见!!!