数据结构-栈
了解什么是数据结构
数据结构的定义<----<-----点击即可查看。
简介
不用说,看标题就能知道,栈是一种数据结构。属于线性表(1维)数据结构。分栈顶指针(栈顶指针指向栈顶元素下标),分进栈和出栈,先进后出。
操作
图片表示
图片解析:
具体实现
用标准栈实现
- 需要调用
#include<stack>
的头文件 - 定义方式:
stack<变量类型> s;
- 插入元素:
s.push(插入元素);
- 弹出栈顶元素:
s.pop();
- 判断栈是否为空:
(!)s.empty();//根据需求使用
- 栈顶元素:
s.top();
用数组实现
- 定义方式:
const int maxn=1e3+10; int top; int s[maxn];//top为栈顶元素
- 插入元素:
s[top++]=插入元素;
- 弹出栈顶元素:
top--;
- 判断栈是否为空:
bool empty(){ return top==0; }
- 栈顶元素:
s[top-1];
经典题目
(由于数据结构只是用于辅助程序,暂时不做分类)
括号匹配
题目链接
题目思路
(这道题很熟是一道用栈的模板题,用两个栈即可)
- 循环由括号组成的字符串
- 判断是左或右括号
- 是左括号
- 压栈
- 将括号下标压入另一栈中
- 是右括号
- 判断站内是否为空
- 为空
- 不可能匹配
- 结束
- 不为空
- 记录左括号和右括号的下标
- 弹出栈顶元素
- 为空
- 判断站内是否为空
- 是左括号
- 判断是左或右括号
- 判断是否匹配
- 是
- 将记录下标数组进行排序(按左括号下标从小到大排序)
- 输出匹配情况
- 结束
- 否
- 输出-1
- 结束
- 是
代码实现
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
string a;
char sta[maxn];
int cnt[maxn];
//答案格式
struct st{
int x,y;
void output(){
cout<<x<<" "<<y<<endl;
}
};
st ans[maxn];
int top,flag,n;
//排序规则
bool cmp(st a,st b){
return a.x<b.x;
}
int main(){
cin>>a;
int lena=a.length();
flag=1;
//按字符串长度进行模拟
for(int i=0;i<lena;i++){
//是左括号
if(a[i]=='('){
sta[top]=a[i];
cnt[top++]=i+1;
}
//是右括号
else {
if(top>0){
ans[n].x=cnt[top-1];
ans[n++].y=i+1;
top--;
}
else {
flag=0;
break;
}
}
}
if(top!=0)flag=0;
//答案处理
if(flag){
sort(ans,ans+n,cmp);
for(int i=0;i<n;i++)ans[i].output();
}
else cout<<-1<<endl;
return 0;
}
求栈的最大值
题目链接
题目思路
(这道题也不怎么难,按照题目所说模拟就完了)
- 循环操作数
- op 1(操作1)
- 将插入元素压栈
- 在对应的下标的记录数组更新栈内最大值
- op 2(操作2)
- 判断是否为空栈
- 是
- 不执行任何操作
- 不是
- 弹出栈顶元素
- 是
- 判断是否为空栈
- op 3(操作 3)
- 输出当前栈顶元素记录的栈内最大值
- op 1(操作1)
- 结束
代码实现
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
int n,top;
int sta[maxn],cnt[maxn];
int main(){
scanf("%d",&n);
top=1;
for(int i=1;i<=n;i++){
int x;
scanf("%d",&x);
if(x==1){
int c;
scanf("%d",&c);
sta[top]=c;
cnt[top++]=max(cnt[top-2],c);
}
else if(x==2){
if(top>1)top--;
}
else printf("%d\n",cnt[top-1]);
}
return 0;
}
本人建议
希望大家可以多多评论提建议,本人会接纳,也希望大家给这个本人提供些资源。更希望大家关注本人。