【数据结构真不难】栈与队列——五一专属|向所有热爱分享的“技术劳动者”致敬(二)

简介: 【数据结构真不难】栈与队列——五一专属|向所有热爱分享的“技术劳动者”致敬(二)

5.栈的应用


5.1大数加法


9992992347234947324732498327427342472987427427984724274

+

  9990920943824283492834824820984028348204209384029293


思路:9293 + 978微信图片_20220530210244.png

5.2后缀表达式


中序表达式:日常生活中编写的都是中序表达式。


a + b - c


后缀表达式:把运算符写在后面的表达式,也称为逆波兰记法


中序:a+b                后缀:ab+

中序:a + b - c        后缀:ab+c-

中序:a + b * c        后缀:abc*+


除运算符之外的内容,依次填写


使用一个栈记录运算符


入栈:新入栈的运算符比栈里的运算符优先级要高。如果是(进行入栈操作


出栈:新入栈的运算符没有栈里的运算符优先级高,栈里的运算符需要出栈,新运算符入栈。如果是)出栈直到(


将以下中序表达式转换成后续表达式


中序:8-(3+2*6)/5+2^2            后缀:8326*+5/-22^+

中序:2*9+3-2*(10-3)/14        后缀:29*3+2103-*14/-

中序:A+B*(C*D-E)              后缀:ABCD*E-*+

中序:a+b*c+(d*e+f)*g           后缀:abc*+de*f+g*+

中序:9+(3-1)*3+10/2           后缀:931-3*+102/+


5.3汉诺塔Hanoi


游戏规则


共3个柱子,在一根柱子上,从下往上按照大小顺序摞着N片圆盘。把圆盘开始按大小顺序重新摆放在另一根柱子上

规定:在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。


算法

package hanoi;
public class TestHanoi {
    private static int count = 0;
    /**
     *
     * @param n 需要移动的盘子数
     * @param x 第一个柱子 起始
     * @param y 第二个柱子 过渡
     * @param z 第三个柱子 最后
     */
    public static void hanoi(int n, char x, char y , char z) {
        if(n == 1) {      //只有一个盘子
            move(x, 1, z);
        } else {
            hanoi(n-1, x, z ,y);     // n上面的盘子,从x柱子,通过z柱子,移动到y柱子
            move(x, n, z);              //n盘子,从x柱子,移动到z柱子
            hanoi(n-1, y, x, z);    // n上面的盘子目前在y柱子,从y柱子,通过x柱子,移动到z柱子。
        }
    }
    /**
     *
     * @param x 第一个柱子
     * @param n 需要移动的盘子号
     * @param z 第三个柱子
     */
    private static void move(char x, int n, char z) {
        count++;
        System.out.println("第"+count+"次移动"+n+"号盘子,从"+x+"柱子到"+z+"柱子");
    }
    public static void main(String[] args) {
        hanoi(4,'x','y','z');
    }
}

6.队列


6.1定义


队列是一个特殊的线性表。


只允许在表尾进行插入操作


只允许在表头进行删除操作


队列操作特点:


先进先出(FIFO,First In First Out)


or 后进后出(LILO,Last In Last Out)


术语:


队尾rear:进行插入操作的一端。


队首front:进行删除操作的一端。


入队offer:进行插入操作,称为入队。


出队poll:进行删除操作,称为出队。微信图片_20220530210444.png


队列两种存储结果分类:


* 使用顺序存储的称为顺序队列

* 使用链式存储称为链队列。


7.顺序队列


7.1顺序队列


顺序队列的存储结构中,需要分配一块地址连续的存储区域来一次存放队列中从队首到队尾的所有元素。


操作总结:


front表示队首,进行出队操作时,front进行计数。


rear表示队尾,进行入队操作时,rear进行计数。


front == rear == 0 空队列。


操作步骤:


入队操作:微信图片_20220530210451.png

出队操作

微信图片_20220530210656.png

存在问题:假溢出,数组的最后一个元素已经添加数据,但队列没有满。

微信图片_20220530210810.png

解决方案:使用循环顺序队列解决“假溢出”问题。微信图片_20220530210855.png

7.2循环顺序队列


循环顺序队列:就是在逻辑上队首和队尾连接在一起。


存在问题:队首front和队尾rear重叠时,无法表示队列是满了,还是空的。


解决方案:


方案1:设计一个计数器(整数变量num,入队+1,出队-1,如果num=0就是空)


方案2:设计一个标识变量(flag=0出队,flag=1入队,重叠后0表示空,1表示满)



方案3:少用一个存储单位微信图片_20220530210900.png

// 队列空
front == rear;
// 队列满
(rear + 1) % maxSize == front;
//余数操作
5 % 5 = 0;
2 % 5 = 2;

 7.3循环顺序队列类


循环顺序队列,在逻辑上是一个循环,也就是队首和队尾连接。微信图片_20220530210906.png

循环顺序队列,物理上就是一个数组。微信图片_20220530210911.png

public Class CircleQueue {
    private Object[] queueElem;  //物理数组
    private int front;    //队首
    private int rear;    //队尾
}


/

 7.4算法:循环顺序队列入队


public void offer(Object x) {
    if( (rear+1) % queueElem.length == front ) {  // 1.判断,如果已经满了,抛异常
        throw new RuntimeException('队列满了');
    } else {
        queueElme[ rear ] = x;           // 2.没有满进行入队操作
        rear = (rear + 1) % queueElem.length;  // 3.队尾rear累加1,但最后时需要归零
    }
}

 

7.5算法:循环顺序队列出队微信图片_20220530210918.png


public Object poll() {
    if( front == rear ) {           // 判断 空 返回null
        return null;
    } 
    Object data = queueElem[front];       // 如果不为空,获得队首front元素
    front = (front + 1) % queueElem.length;   // 队首+1,且需要归零  
    return data;
}


相关文章
|
9天前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
76 9
|
3天前
|
存储 算法 Java
数据结构的栈
栈作为一种简单而高效的数据结构,在计算机科学和软件开发中有着广泛的应用。通过合理地使用栈,可以有效地解决许多与数据存储和操作相关的问题。
|
6天前
|
存储 JavaScript 前端开发
执行上下文和执行栈
执行上下文是JavaScript运行代码时的环境,每个执行上下文都有自己的变量对象、作用域链和this值。执行栈用于管理函数调用,每当调用一个函数,就会在栈中添加一个新的执行上下文。
|
8天前
|
存储
系统调用处理程序在内核栈中保存了哪些上下文信息?
【10月更文挑战第29天】系统调用处理程序在内核栈中保存的这些上下文信息对于保证系统调用的正确执行和用户程序的正常恢复至关重要。通过准确地保存和恢复这些信息,操作系统能够实现用户模式和内核模式之间的无缝切换,为用户程序提供稳定、可靠的系统服务。
30 4
|
12天前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
25天前
数据结构(栈与列队)
数据结构(栈与列队)
16 1
|
1月前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
27 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
1月前
初步认识栈和队列
初步认识栈和队列
57 10
|
1月前
|
算法
数据结构与算法二:栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式
这篇文章讲解了栈的基本概念及其应用,并详细介绍了中缀表达式转换为后缀表达式的算法和实现步骤。
42 3
|
30天前
|
存储 JavaScript 前端开发
为什么基础数据类型存放在栈中,而引用数据类型存放在堆中?
为什么基础数据类型存放在栈中,而引用数据类型存放在堆中?
63 1
下一篇
无影云桌面