数据结构和算法之栈和队列一:两个栈模拟一个队列以及两个队列模拟一个栈

  今天我们需要学习的是关于数据结构里面经常看到的两种结构,栈和队列。可以说我们是一直都在使用栈,比如说在前面递归所使用的的系统的栈,以及在链表倒序输出时介绍的自定义栈类Stack和使用系统的栈进行递归。那么,在这里我们就讲述一下这两个比较具有特色的或者说关系比较紧密的数据结构之间的互相实现问题。

一:两个栈模拟实现一个队列: 栈的特点是先进后出,然而队列的特点是先进先出。

    

public class Queen(Stack s1,Stack s2){
     //实现插入的方法
     public void add(int num){
            s1.push(num);
     }
     //删除
     public void delete(){
          //判断s2是否有值
          if(s2.size() > 0){
                 s2.pop();
          }else{
                 //先把s1里面的内容加入s2
                 for(int i = 0;i < s1.size() - 1;i++){
                       s2.push(s1.pop());
                 }
                 //把s1剩下的一个节点直接弹出就行
                 s1.pop();
          }
     }
}                            

   两个栈模拟一个队列的思路和算法还是比较简单的,只需要注意细节就行,别让自己的算法出错。

   二:用两个队列模拟一个栈:

        

 1 public class MyQueue(){
 2       //声明两个模拟的队列
 3      Queue<Integer> q1 = new ArrayDeque<>();
 4      Queue<Integer> q2 = new ArrayDeque<>();
 5      //添加操作
 6      public void push(int num){
 7          //判断两个队列是否都为空
 8          if(q1.isEmpty() && q2.isEmpty()){
 9                //优先考虑q1执行增加操作
10                q1.offer(num);
11          }else if(q1.isEmpty()){
12                q2.offer(num);
13          }else{
14                 q1.offer(num);
15          }
16      }
17      //删除操作
18      public int pop(){
19           if(q1.isEmpty() && q2.isEmpty()){
20                throw new Expection("空栈无数据弹出");
21           }else if(q1.isEmpty()){
22                for(int i = 0;i < q2.size() - 1;i++){
23                      q1.offer(q2.poll);
24                }
25                return q2.poll();
26          }else{
27                  for(int i = 0;i < q1.size() - 1;i++){
28                      q2.offer(q1.poll);
29                }
30                return q1.poll();
31          }
32      }
33 }    

  队列模拟栈也好,栈模拟队列也罢,其实无非就是抓住队列先进先出,栈后进先出的特点然后进行实现他们的增加删除操作。但是在这个过程中注意自己的严谨性很重要。

时间: 2024-12-28 00:55:48

数据结构和算法之栈和队列一:两个栈模拟一个队列以及两个队列模拟一个栈的相关文章

用JS描述的数据结构及算法表示——栈和队列(基础版)

前言:找了上课时数据结构的教程来看,但是用的语言是c++,所以具体实现在网上搜大神的博客来看,我看到的大神们的博客都写得特别好,不止讲了最基本的思想和算法实现,更多的是侧重于实例运用,一边看一边在心里隐隐歌颂大神的厉害,然后别人的厉害不是我的,所以到底看得各种受打击+头昏脑涨,写这个系列是希望自己能够总结学到东一块.西一下的知识,因为水平有限+经验不足,所以在此只说最基础的思想,附上我自己的算法实现(肯定还有更优解),如果要想看进阶版的,可以在园里搜“数据结构”,各种语言实现和进阶提升的文章有很

Java数据结构和算法之栈与队列

二.栈与队列 1.栈的定义 栈(Stack)是限制仅在表的一端进行插入和删除运算的线性表. (1)通常称插入.删除的这一端为栈顶(Top),另一端称为栈底(Bottom). (2)当表中没有元素时称为空栈. (3)栈为后进先出(Last In First Out)的线性表,简称为LIFO表. 栈的修改是按后进先出的原则进行. 每次删除(退栈)的总是当前栈中"最新"的元素,即最后插入(进栈)的元素,而最先插入的是被放在栈的底部,要到最后才能删除. 图1 [示例]元素是以a1,a2,-,a

Java数据结构与算法(第四章栈和队列)

本章涉及的三种数据存储类型:栈.队列和优先级队列. 不同类型的结构 程序员的工具 数组是已经介绍过的数据存储结构,和其他结构(链表.树等等)一样,都适用于数据应用中作数据记录. 然而,本章要讲解的是数据结构和算法更多的是作为程序员的工具来运用.它们组要作为构思算法的辅助工具,而不是完全的数据存储工具.这些数据结构的生命周期比那些数据库类型的结构要短的多.在程序操作执行期间它们才被创建,通常它们去执行某项特殊的任务,当完成之后,它们就被销毁. 受限访问 在数组中,只要知道下标就可以访问数据项.或顺

数据结构与算法--栈、队列(队列)

Hello,everybody.我们又见面了.今天我们来学习一下队列这个数据结构,let's Go,开始我们的征程吧. 首先,举两个生活中的常见例子.相信大家,在用电脑工作娱乐时,都会碰到这样的现象.当我们点击程序或进行其他操作时,电脑处于死机状态.正当我们准备Reset时,它突然像打了鸡血似的,突然把刚才我们的操作,按顺序执行了一遍.之所以会出现这个现象,是因为操作系统的多个程序,需要通过一个管道输出,而按先后顺序排队造成的. 还有有个例子,在我们打客服热线时,有时会出现等待的现象.当其他客户

数据结构与算法系列研究二——栈和队列

栈和队列的相关问题分析 一.栈和队列定义 栈和队列是两种重要的数据结构.从结构特性角度看,栈和队列也是线性表,其特殊性在于它们的基本操作是线性表的子集,是操作受限的线性表,可称为限定性的数据结构:从数据类型角度看,其操作规则与线性表大不相同,是完全不同于线性表的抽象数据类型.                    图1 栈的结构                                                 图2 队列的结构   1.1.栈是限定在表的一端进行插入和删除操作的线性

数据结构和算法-数据结构-线性结构-栈和队列

 ################################################## """ 三.线性结构 (1)栈 1.定义:栈是一个数据集合,可以理解为只能在一端进行插入或者删除操作的列表. 2.栈的特点:后进先出(last-in,first-out),简称LTFO表 这种数据结构的特点: 就是像是杯子或者是弹夹,电梯, 存储的时候从底部开始,读取的时候从顶部开始,具备这种特点就是栈 就是后进先出, 存储的时候就可以从顺序表或者链表就可以实现, 只让从一

Java数据结构与算法-栈和队列

(摘录加总结)------ 栈和队列不属于基础的数据结构,它们都属于线性表. 一.栈 对于栈存储操作元素只能在栈结构的一端进行元素的插入和删除,是一种性质上的线性表结构.按照“先进后出”的原则进行存储数据.先进的元素在栈底,后进的元素在栈顶.需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来).比较常规的说明是:栈底固定,而栈顶浮动:栈中元素个数为零时称为空栈.插入一般称为进栈(PUSH),删除则称为退栈(POP). 栈的实现结构包括顺序结构实现和链式结构实现.前者依据的是数组,后者

数据结构与算法01--堆栈 &amp; 队列

基于顺序表的堆栈 基于链式表的堆栈 1 基于顺序表的堆栈 栈是一种特殊的线性表,是限定在线性表表尾进行插入删除操作的线性表.由栈的概念衍生出几个子概念,它们是: 1)栈顶,即允许进行插入.删除操作的一端,又称为表尾,用栈顶指针(top)来指示栈顶元素. 2)栈底,即固定端,又称为表头 3)空栈,即栈当中没有数据元素. 顺序栈是采用顺序存储结构的栈,即使用一组连续的存储单元(一般使用数组)来模拟栈,依次存放栈中的数据元素. 1.1 方案 顺序栈的基本操作包括: 1) 初始化操作,在初始化操作中将建

数据结构与算法(3)-----&gt;队列和栈

1. 栈和队列的基本性质 栈是先进后出;(像是子弹夹,后进先打出) 队列是先进先出;(像是平时排队买冰淇淋,按顺序轮流) 栈和队列在实现的结构上可以有数组和链表两种形式; (1)数组结构实现容易; (2)用链表结构较为复杂,因为牵扯很多的指针操作; 1.1  栈结构的基本操作 (1)pop操作;(弹出) (2)top或peek操作; (3)push操作;(压栈) (4)size操作; 1.2  队列的基本操作 (1)队列的基本操作与栈操作不同的是,push操作作为在队头加入元素;而pop操作是从

数据结构与算法:栈+队列+递归

[栈] Python实现: 1. 用数组实现一个顺序栈 class SStack(): def __init__(self): self._elems = [] def is_empty(self): return self._elems == [] def top(self): if self._elems == []: raise StackUnderflow("in SStack.top()") return self._elems[-1] def push(self, elem