栈和队列:用一个栈实现另一个栈的排序

题目: 一个栈中的元素类型为整型,现在想将该栈从顶到底按从大到小的顺序排序,只允许申请一个栈。如何完成排序?

将排序的栈记为 stack,辅助栈记为 help,在stack上执行pop操纵,弹出的元素为 tmp

1. 如果 tmp 大于或等于 help 的栈顶元素或 help 为空,则将 tmp 压入 help;

2. 如果 tmp 小于 help 的栈顶则将 help 的元素弹出,逐一压入 stack,直到 tmp 大于或等于 help 的栈顶元素,再将 tmp 压入 help;

一直执行到 stack 中所有元素都压入 help 即完成排序。

    public Stack<Integer> sortStackByStack(Stack<Integer> stack)
    {
        Stack<Integer> help = new Stack<Integer>();
        while(!stack.isEmpty())
        {
            int tmp = stack.pop();
            while(!help.isEmpty() && tmp < help.peek())
            {
                stack.push(help.pop());
            }
            help.push(tmp);
        }

        return help;
    }

参考资料:程序员代码面试指南IT名企算法与数据结构题目最优解, 左程云

时间: 2024-10-13 11:35:06

栈和队列:用一个栈实现另一个栈的排序的相关文章

9.3栈和队列(七)——用两个栈来实现一个队列

/** * 功能:用两个栈来实现一个队列. */ import java.util.*; /** * 思路:需要修改peek()和pop(),以相反顺序执行操作.可以利用第二个栈来反转元素的次序. * stackNewest顶端为最新元素,stackOldest顶端为最旧元素,利用两个栈的元素的转移来实现. * */ public class MyQuene1 { Stack stackNewest ,stackOldest ; public MyQuene1(){ stackNewest= n

数据结构与算法分析:栈与队列

以下是对数据结构中的栈和队列的一些总结: 一.栈 栈(Stack)是一种特殊的线性表,有后进先出(Last In First Out, LIFO)的性质,且只能从线性表的一段进行插入和删除元素等操作. 栈的常用操作有:进栈.出栈.取栈顶.将栈置空.判断栈是否为空.判断栈是否已满等等. 由于栈也属于线性表,因此线性表的存储结构对栈也适用,因此,使用数组或者单向链表均可以实现栈.这两种存储结构的不同,因此实现栈的方式也有不同,形成的栈的性质也有所不同.一个常见的区别是,在顺序栈中有"上溢"

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

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

数据结构习题之栈和队列

第三章  栈和队列 一.    基本要求.重点.难点 本章的目的是介绍栈和队列的逻辑结构定义及在两种存储结构上如何实现栈和队列的基本运算.要求在掌握栈和队列的特点的基础上,懂得在什么样的情况下能够使用栈或队列.本章重点是掌握栈和队列在两种存储结构上实现的基本运算,难点是循环队列中对边界条件的处理. 二.    考核目标和考核要求 要求达到识记层次的有:栈和队列的特点,什么样的情况下能够使用栈或队列 要达到综合应用层次的有:栈的逻辑结构特点,栈与线性表的异同:顺序栈和链栈上实现的进栈.退栈等基本算

【数据结构】栈和队列

栈和队列 容器数据结构是指一些包含了若干个其他相同或不同的数据结构的数据结构,被包含的这些每一个独立的数据结构都被称为一个元素,在一个容器中的元素往往支持相同的操作,具有类似的性质.之前说到过的线性表其实就是一种容器数据结构,本文中介绍的两种最常用的容器数据结构是栈和队列. 从功能上看,栈和队列大多用于计算过程中保存临时数据,这些数据是在计算过程中发现或产生的.在而后的计算中可能会用到这些数据.如果这些数据是固定的个数以及大小的话,可以构建几个变量来储存它们,但是如果这些数据不确定的话,就需要一

【常用算法思路分析系列】栈和队列高频题集(修改版)

本文是[常用算法思路分析系列]的第三篇,分析栈和队列相关的高频题目.本文分析:1.可查询最值的栈:2.用两个栈实现队列的功能:3.反转栈中元素:4.排序栈中元素:5.滑动窗口问题. 本系列前两篇导航: [常用算法思路分析系列]排序高频题集 [常用算法思路分析系列]字符串高频题集 1.可查询最值的栈 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 思路: 定义两个栈stackData和stackMin,其中stackData用来存放进栈的数据,stackMin用来存放进栈过

Algorithm --&gt; 两个栈实现队列和两个队列实现栈

两个栈实现队列和两个队列实现栈 队列(queue)先进先出的线性表:栈(stack)先进后出的线性表. 两个栈实现队列 法一思路: s1是入栈的,s2是出栈的. 入队列:直接压入s1即可: 出队列:如果s2不为空,把s2中的栈顶元素直接弹出:否则,把s1的所有元素全部弹出压入s2中,再弹出s2的栈顶元素. 代码: #include <stack> #include <iostream> #include <cassert> using namespace std; te

关于栈和队列随想

1 在算法中栈和队列的地位 在算法中,栈和队列就是一个缓存,缓存那些对自己还有用的元素,还不用扔掉的元素. 比如对图的深度优先搜索,搜到某一层时,还只是访问了该元素的一个邻接节点时,是不能随便扔出栈的,因为可能它还有其它的邻接节点,首先它自己肯定是已经被访问了的,但是如果把它扔了,它的其它邻接节点也就被扔了,所以,只有当它的所有的邻接节点也被访问了的时候才可以把它扔掉. 2 对图进行遍历的时候,如何标记栈中的元素已经被访问的邻接节点和未被访问的邻接节点 图中的每个节点都是有一个label的,并且

数据结构之栈和队列及其Java实现

栈和队列是数据结构中非常常见又非常基础的线性表,在某些场合栈和队列使用很多,因此本篇主要介绍栈和队列,并用Java实现基本的栈和队列,同时用两个栈实现队列和用两个队列实现栈. 栈:栈是一种基于"后进先出"策略的线性表.在插入时(入栈),最先插入的元素在栈尾,最后插入的元素在栈顶:在删除时(出栈),最后插入的元素先出栈,最先插入的元素最后出栈.由此可见,对栈的插入和删除操作都是在栈顶位置进行的. 在Java中,提供了一个类Stack<E>来实现栈的这些特性,并提供了一些常用的

栈跟队列

栈跟队列的区别: 栈:先进后出,限定只能在表的一端进行插入和删除(表尾),栈只能从头部取出数据,也就是最先放入的需要遍历整个栈最后才能取出,而且遍历时还得为数据开辟临时空间. 队列:先进先出,只能在表的一端进行插入,并且在表的一端进行删除,遍历数据速度不同,而且可以从头或者尾部开始遍历,但不能同时遍历,无需开辟临时空间,因为遍历过程中不影响数据结构. 相同点:1.都是线性结构.2.插入操作都是在表尾进行. 3.都可以通过顺序结构和链式结构实现. 4.插入与删除的时间复杂度都是哦o(1),在空间复