开头声明
本文由署髫亲自撰写并非转载。
如果代码或文章内容有误,请大佬们及时指出。
部分内容是从网上复制的。
!!链接绝对安全无毒!!
点个赞呗~
什么是栈
栈是一种后进先出(LIFO)的数据结构,它支持两种主要的操作:进栈和出栈。在C++中,栈可以用数组或链表来实现,但使用数组实现的顺序栈在编程实践中更为常见。顺序栈的实现包括栈的初始化、销毁、判断是否为空、进栈、出栈以及获取栈顶元素等操作。C++标准模板库(STL)提供了一个
<stack>
头文件,其中定义了一个栈模板类。使用STL中的栈,只需要包含相应的头文件,并指定数据类型即可创建一个栈对象。
举个例子
这是一个火车站(手搓的不太好看) ,每节车厢(1~9的数字)都可以单独行驶但都不能倒车,且车厢可以随意拆分、组合。我们可把栈看成这个火车站,把输入的数据看成车的每节车厢,每节车厢进入火车站就相入栈,出火车站就是出站。
入栈顺序就是
1 2 3 4 5 6 7 8 9
出站顺序就是
9 8 7 6 5 4 3 2 1
学过栈的小伙伴应该知道栈入栈出栈的顺序是相反的,我们回到上面的图片
车厢1先入栈、然后是2,、3、4......直到全部入栈 ,就成了图中的样子,由于为尾部不去,所以只能从头部出栈顺序就是车厢9先出栈、然后是8、7、6......直到全部出栈,所以入栈顺序和出站顺序是相反的,所以站可以用来反转数据。
代码实现1
我们可以先用数组来模拟栈,用自定义函数来实现栈的功能。
创建一个栈
int a[1001],top=0;
因为我们要模拟栈,所以我用了数组来模拟。top代表的是入栈和出栈的位置
入栈
void push(int x){
if(top<5){
top++;
a[top]=x;
}
return;
}
x就是我们要入栈的内容,判断top<5是要防止满栈后继续入栈,实际满栈的大小要根据题目来决定,top++就是说明我们这一位已经存储过了,a[top]=x就是把我们栈的这一位设置成我们要入栈的内容。
出栈
void pop(){
if(top>0){
top--;
}
return;
}
判断top>0就是防止top出现到负数导致报错,top--就是删除这一位的值,有的小伙伴会问“为什么不把当前的值归零呢?”因为就算我们不归零,也不会使用这一位了,就算在这一位入栈了,也会直接覆盖。
获取栈顶
int gettop(){
return a[top];
}
获取栈顶只要返回栈的上一次删除的上一位或入栈的下一位即可。
判断是否为空
bool empty(){
if(top==0){
return 0;
}
return 1;
}
判断栈的首位是第几位,如果是最后一个,那么就空了,否则是未空的。
获取大小
int size(){
return top;
}
因为top代表栈的首位是第几位,所以知道栈的首位是第几位就知道栈有多长了。
代码实题
描述
输入5个整数,将这5个整数进行入栈,接下来做三次出栈操作,按照出栈顺序输出出栈元素,以上操作完成后输出此时的栈顶元素。
输入描述
输入5个整数,用空格隔开。
输出描述
输出2行,第1行输出出栈元素,按照出栈顺序输出,用空格隔开。第2行输出完成出栈操作后的栈顶元素。
#include<bits/stdc++.h>
using namespace std;
int a[1001],top;
void push(int x){
if(top<1000{
top++;
a[top]=x;
}
return;
}
void pop(){
if(top>0){
top--;
}
return;
}
int gettop(){
return a[top];
}
int main(){
int num;
for(int i=0;i<5;i++){
cin>>num;
push(num);
}
for(int i=0;i<3;i++){
cout<<gettop()<<" ";
pop();
}
cout<<endl<<gettop();
return 0;
}
主函数
int num;
for(int i=0;i<5;i++){
cin>>num;
push(num);
}
先定义一个num,用来接收输入数据,再写一个for循环,用来循环输入。把每一位输入后依次入栈。
for(int i=0;i<3;i++){
cout<<gettop()<<" ";
pop();
}
cout<<endl<<gettop();
根据题目要求,依次输出栈的前3位,最后换行输出栈顶(记得删除)。
代码实现2
我们可以用STL模版中的stack容器实现栈
STL模版stack容器(栈)的函数
stack<int>a; // 通过STL模版创建栈
a.push(b); // 向栈顶添加元素
a.pop(); // 从栈顶移除第一个元素
a.top(); // 返回栈顶元素
a.size(); // 栈中元素数量
a.empty(); // 判断是否为空
代码实题
描述
有一个包含n个正整数的数字序列,还有一个整数栈。
定义两个操作:
x :将数字序列中的前一个位置中的数入栈,并将这个数从序列中删除
z :从整数栈中弹出栈顶元素,并输出
现在告诉你一系列包含两个操作的合法字符串,问出栈的数都有哪些值?
输入描述
输入第一行为一个正整数 n,接下来一行有 n 个正整数,再接下来一行为包含“ x ”、“ z ”两个操作的字符串
输出描述
按出栈的顺序输出出栈的整数,每个整数之间用一个空格隔开。
#include<bits/stdc++.h>
using namespace std;
int main(){
int a[1001];
stack<int> s;
int b,d=0;
string c;
cin>>b;
for(int i=0;i<b;i++){
cin>>a[i];
}
cin>>c;
for(int i=0;i<c.length();i++){
if(c[i]=='x'){
s.push(a[d]);
d++;
}else if(c[i]=='z'){
cout<<s.top()<<" ";
s.pop();
}
}
return 0;
}
主函数
int a[1001];
stack<int> s;
int b,d=0;
string c;
cin>>b;
for(int i=0;i<b;i++){
cin>>a[i];
}
cin>>c;
因为题目没有明确要全部入栈,所以先放在列表里储存。先输入b,确定有几个数。再用for循环循环输入每一个数。最后根据题意输入一个字符串,用来存放要对栈进行的操作。
for(int i=0;i<c.length();i++){
if(c[i]=='x'){
s.push(a[d]);
d++;
}else if(c[i]=='z'){
cout<<s.top()<<" ";
s.pop();
}
}
最后判断是要出栈还是进栈(根据题意得知x是入栈,z是出栈),按步骤操作即可。
视角拓展
基于STL模版中的栈,我们可以修改主函数的部分内容,实现其他程序。
我给大家挑了几道简单的小题,大家可以做一做:
都看到这儿了,就点个赞呗~
署髫只是个初中生,就点一个吗~