数据结构:栈和队列

1.栈(Stack)

1.1 概念

栈,它是一种特殊的线性表,是一种遵循后进先出 (LIFO)原则的线性数据结构,仅允许在栈顶进行插入(入栈)和删除(出栈)操作。它只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。用图片表述可看成是这样:

1.2 常用方法

栈与顺序表一样,它也有一些内置的方法,这些方法我们需要去掌握 ,经常会用上。需要使用的时候就还是按 对象.方法 的用法去使用。

|-----------------|----------|
| 方法 | 功能 |
| Stack() | 构造一个空的栈 |
| push(e) | 将 e 入栈 |
| pop() | 将栈顶元素出栈 |
| peek() | 获取栈顶元素 |
| int size() | 获取栈中元素个数 |
| boolean empty() | 检测栈是否为空 |

想创建栈的话,通用的语句是 Stack<Character> stack = new Stack<>(); 这里的stack是一个变量。

1.3 选择题练习

下来我们先练习一下,方便快速掌握:

  1. 若进栈序列为 1,2,3,4 ,进栈过程中可以出栈,则下列不可能的一个出栈序列是()

A: 1,4,3,2 B: 2,3,4,1 C: 3,1,4,2 D: 3,4,2,1

2.一个栈的初始状态为空。现将元素1、2、3、4、5、A、B、C、D、E依次入栈,然后再依次出栈,则元素出栈的顺序是( )。

A: 12345ABCDE B: EDCBA54321 C: ABCDE12345 D: 54321EDCBA

答案如下:

  1. C 2. B

2. 队列(Quece)

2.1 概念

与栈相似,队列是只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,但是队列具有的是先进先出的特性。

2.2 常用方法介绍

方法 功能
boolean offer(e) 入队列
poll() 出队列
peek() 获取队头元素
int size() 获取队列元素个数
boolean isEmpty() 检测队列是否为空

所以可以看到,栈和队列的方法大都很相似,还是容易去记的。

注意:Queue是个接口,在实例化时必须实例化LinkedList的对象,因为LinkedList实现了Queue接口。如果需要实例化一个队列时,举例如下:

例:Queue<Integer> quece = new LinkedList<>();

2.3 双端队列

双端队列(deque)是指允许两端都可以进行入队和出队操作的队列,deque 是 "double ended queue" 的简称。这就说明元素可以从队头出队和入队,也可以从队尾出队和入队

Deque是一个接口,使用时必须创建LinkedList的对象。

在实际工程中,使用Deque接口是比较多的,栈和队列 均可以使用该接口,实例化格式如下

Deque<Integer> stack = new ArrayDeque<>();//双端队列的线性实现

Deque<Integer> queue = new LinkedList<>();//双端队列的链式实现

3. OJ题练习

主要的知识已经陈述完毕,下面就是运用这些方法和类去做做题了。

20. 有效的括号 - 力扣(LeetCode)

思路:利用栈的特点,如果是左括号就入栈,如果是右括号那我们就peek一下栈顶节点判断是否能构成一组,不能就直接return false。然后就是排查特殊情况:

  1. 在入栈过程中可能该字符串只有左括号,那么在入栈的过程中一定会把该字符串加完,所以最后我们要判断一下栈是否为空,如果是true的话那栈里面肯定没有括号存在。栈为空就是true,反之false。

  2. 在不断入栈过中,如果该字符串是右括号但是此时栈为空,就说明它不可能会有对应的左括号存在,此时我们也直接返回false。

参考答案:

java 复制代码
Stack<Character> stack = new Stack<>();
        for(int i = 0;i < s.length();i++){
            char a = s.charAt(i);
            if(a == '(' || a == '{' || a == '['){
                stack.push(a);
                continue;
            }else{
                 if(stack.empty()){
                 return false;
                 }
                 char b = stack.peek();
                if(b == '(' && a == ')'
                || b == '{' && a == '}'
                || b == '[' && a == ']'){
                    stack.pop();
                 }else{
                     return false;
                 }
            }
        }
        if(stack.empty()){
            return true;
        }
            return false;

栈的压入、弹出序列_牛客题霸_牛客网

参考答案:

java 复制代码
public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param pushV int整型一维数组 
     * @param popV int整型一维数组 
     * @return bool布尔型
     */
    public boolean IsPopOrder (int[] pushV, int[] popV) {
        // write code here
        Stack<Integer> stack = new Stack<>();
        int j = 0;
        for(int i = 0;i < pushV.length;i++){
            stack.push(pushV[i]);
            int num = stack.peek();
            while(!stack.empty() && j < pushV.length && stack.peek() == popV[j]){
                 stack.pop();
                 j++;
            }
        } 
        // return stack.empty();
        if(!stack.empty()){
            return false;
        }else{
            return true;
        }
    }
    
}

那么,本篇文章到此结束!希望能对你有帮助。

相关推荐
xwl12123 小时前
10.6 作业
数据结构·算法
西望云天13 小时前
The 2024 ICPC Asia Nanjing Regional Contest(2024南京区域赛EJKBG)
数据结构·算法·icpc
wdfk_prog18 小时前
[Linux]学习笔记系列 -- lib/timerqueue.c Timer Queue Management 高精度定时器的有序数据结构
linux·c语言·数据结构·笔记·单片机·学习·安全
zhuzhuxia⌓‿⌓18 小时前
线性表的顺序和链式存储
数据结构·c++·算法
高山有多高19 小时前
栈:“后进先出” 的艺术,撑起程序世界的底层骨架
c语言·开发语言·数据结构·c++·算法
YouEmbedded19 小时前
解码查找算法与哈希表
数据结构·算法·二分查找·散列表·散列查找·线性查找
小秋学嵌入式-不读研版20 小时前
C61-结构体数组
c语言·开发语言·数据结构·笔记·算法
Nix Lockhart21 小时前
《算法与数据结构》第七章[算法3]:图的最小生成树
c语言·数据结构·算法