数据结构-栈

本文介绍了数据结构中的栈,并通过C++代码详细展示了如何使用标准栈和数组实现。内容包括栈的基本操作、括号匹配问题的解题思路及代码实现,以及求栈内最大值问题的解决方案。同时,提供了相关经典题目的链接和解题策略,帮助读者深入理解栈的应用。
摘要由CSDN通过智能技术生成

了解什么是数据结构

数据结构的定义<----<-----点击即可查看。

简介

不用说,看标题就能知道,栈是一种数据结构。属于线性表(1维)数据结构。分栈顶指针(栈顶指针指向栈顶元素下标),分进栈和出栈,先进后出。

操作

图片表示

图片解析:
Alt

具体实现

用标准栈实现

  1. 需要调用#include<stack>的头文件
  2. 定义方式:stack<变量类型> s;
  3. 插入元素:s.push(插入元素);
  4. 弹出栈顶元素:s.pop();
  5. 判断栈是否为空:(!)s.empty();//根据需求使用
  6. 栈顶元素:s.top();

用数组实现

  1. 定义方式:const int maxn=1e3+10; int top; int s[maxn];//top为栈顶元素
  2. 插入元素:s[top++]=插入元素;
  3. 弹出栈顶元素:top--;
  4. 判断栈是否为空:bool empty(){ return top==0; }
  5. 栈顶元素:s[top-1];

经典题目

(由于数据结构只是用于辅助程序,暂时不做分类)

括号匹配

题目链接

括号匹配

题目思路

(这道题很熟是一道用栈的模板题,用两个栈即可)

  1. 循环由括号组成的字符串
    1. 判断是左或右括号
      1. 是左括号
        1. 压栈
        2. 将括号下标压入另一栈中
      2. 是右括号
        1. 判断站内是否为空
          1. 为空
            1. 不可能匹配
            2. 结束
          2. 不为空
            1. 记录左括号和右括号的下标
            2. 弹出栈顶元素
  2. 判断是否匹配
      1. 将记录下标数组进行排序(按左括号下标从小到大排序)
      2. 输出匹配情况
      3. 结束
      1. 输出-1
      2. 结束

代码实现

#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;
}

求栈的最大值

题目链接

求栈的最大值

题目思路

(这道题也不怎么难,按照题目所说模拟就完了)

  1. 循环操作数
    1. op 1(操作1)
      1. 将插入元素压栈
      2. 在对应的下标的记录数组更新栈内最大值
    2. op 2(操作2)
      1. 判断是否为空栈
          1. 不执行任何操作
        1. 不是
          1. 弹出栈顶元素
    3. op 3(操作 3)
      1. 输出当前栈顶元素记录的栈内最大值
  2. 结束

代码实现

#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;
}

本人建议

希望大家可以多多评论提建议,本人会接纳,也希望大家给这个本人提供些资源。更希望大家关注本人。

Alt
Alt

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

materialistOier

我只是一名ssfoier

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

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

打赏作者

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

抵扣说明:

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

余额充值