数据结构-栈

数据结构-栈

了解什么是数据结构

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

简介

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

操作

图片表示

图片解析:
数据结构-栈

具体实现

用标准栈实现

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

本人建议

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

数据结构-栈
数据结构-栈

上一篇:如何在JAVA代码中进行数据库加锁操作?


下一篇:<数据结构>XDOJ321.高铁网络