Stack_Queue 把栈排序 Sort a stack @CareerCup

Stacksort 栈排序的简单例子 Stacksort // // main.cpp // T2_StackSort // // Created by apple on 2019/2/18. // Copyright © 2019 apple. All rights reserved. // #include <iostream> #include <stack> #include <v 阅读详情

原文:

Write a program to sort a stack in ascending order. You should not make any assumptions about how the stack is implemented. The following are the only functions that should be used to write this program: push | pop | peek | isEmpty.

译文:

写程序将一个栈按升序排序。对这个栈是如何实现的,你不应该做任何特殊的假设。 程序中能用到的栈操作有:push | pop | peek | isEmpty。


至少有四种方法:

1)借助另一个栈来排序:

另一个栈(有序栈)装排序完(从大到小)的结果。如何把无序栈的元素添加到有序栈呢?我们可以把下一个待插入的元素存放在一个临时变量toInsert里,然后在有序栈里,把所有比toInsert大的都倒腾到无序栈内。这样保证当toInsert插入有序栈时,toInsert以下的所有元素都小于它。然后继续处理下一个无序栈栈顶元素,最后直到无序栈中的所有元素都被转移到有序栈中!Time: O(N^2), Space: O(N)


2)如果可以用heap/priority queue,则就太简单了。

3) 可以在栈上进行merge sort。把当前栈的元素分到左右两个子栈,然后分别对两个子栈排序。最后是merge过程。不过要注意:栈只能从栈顶取元素,而左右栈已经是按从大到小排序好,所以要取出较大的元素压入stack,这样stack会变成从小到大排序,因此在merge的最后需要reverse stack!

4) 还可以在栈上进行quick sort。原理同merge sort


package Stack_Queue;

import java.util.Stack;

import CtCILibrary.AssortedMethods;

public class S3_6 {

	// 输入一个乱序的栈,返回一个排序过(栈顶最大,栈底最小)的栈
	// Time: O(N^2), Space: O(N)
	public static Stack<Integer> sort(Stack<Integer> stack) {
		Stack<Integer> sorted = new Stack<Integer>();
		while( !stack.isEmpty() ) {
			int toInsert = stack.pop();		// 先保存待处理的元素到一个临时变量
			while( !sorted.isEmpty() && sorted.peek() > toInsert ) {		// 把比toInsert大的元素都倒腾到stack
				stack.push(sorted.pop());
			}
			sorted.push(toInsert);			// 现在sorted栈顶元素已经小于toInsert,可以直接插入了
		}
		return sorted;
	}
	
	// mergeSort
	// Time: O(NlogN), Space: O(N)
	public static Stack<Integer> mergeSort(Stack<Integer> stack) {
		if ( stack.size() <= 1) {
			return stack;
		}
		
		Stack<Integer> left = new Stack<Integer>();
		Stack<Integer> right = new Stack<Integer>();
		
		int count = 0;
		while (stack.size() != 0) {
			count++;
			if (count % 2 == 0) {
				left.push(stack.pop());
			} else {
				right.push(stack.pop());
			}
		}
		
		left = mergeSort(left);
		right = mergeSort(right);
		
		// merge合并过程
		while ( left.size()>0 || right.size()>0 ) {
			if ( left.size() == 0 ) {	// 左栈为空,把右栈全部添加到stack
				stack.push(right.pop());
			} else if ( right.size() == 0 ) {	// 右栈为空为空,把左栈全部添加到stack
				stack.push( left.pop() );
			} 
			// 注意到栈只能从栈顶取元素,而左右栈已经是按从大到小排序好
			// 所以要取出较大的元素压入stack,这样stack会变成从小到大排序,
			// 因此在merge的最后需要reverse stack
			else if ( right.peek().compareTo(left.peek()) <= 0 ) {
				stack.push(left.pop());
			} else {
				stack.push(right.pop());
			}
		}
		
		Stack<Integer> reveseStack = new Stack<Integer>();
		while (stack.size() > 0 ) {
			reveseStack.push(stack.pop());
		}
		
		return reveseStack;
	}
	
	
	public static void main(String [] args) {
		Stack<Integer> s = new Stack<Integer>();
		
		for (int k = 1; k < 5; k++) {
				int r = AssortedMethods.randomIntInRange(0,  1000);
				s.push(r);
		}
		
//		s = sort(s);
		s = mergeSort(s);
		int last = Integer.MAX_VALUE;
		while(!s.isEmpty()) {
			int curr = s.pop();
			System.out.println(curr);
			if (curr > last) {
				System.out.println("Error: " + last + " " + curr);
			}
			last = curr;
		}
	}
}




Java实现顺序栈的完整设计与实战 栈是一种受限的线性数据结构,只允许在一端(称为栈顶)进行插入和删除操作,其核心原则是“后进先出”(LIFO)。例如,连续入栈元素A、B、C后,出栈顺序必为C、B、A。抽象数据类型(Abstract Data Type, ADT)是一种从数学角度描述数据结构行为的方式,它强调“做什么”而非“如何做”。对于栈这一数据结构而言,其ADT应明确界定以下基本操作:入栈(push)、出栈(pop)、查看栈顶元素(peek)、判空(isEmpty)和获取大小(size)。这些操作共同构成了栈的行为契约。 阅读详情

相关推荐

跟着团子学SAP CO:基于成本的完工百分比结算:Cost-based POC(以项目为例)

本文以英国及北美会计准则下的基于成本的POC的销售型项目结算对PS模块中的完工百分比进行介绍

Lucas1211的博客 2万+

优化stack元素排序

对于一个已知队列,如何不借助

EaShion1994的专栏 772

wsl + vscode 离线配置 ERROR: Faild to download https://update.code.visualstudio.com

很多情况下是没有现成的VS Code Server程序的,需要手动下载。记住上面的Commit ID,可以通过下面的链接下载 vscode-server-linux-x64.tar.gz。然后将vscode-server-linux-x64.tar.gz上传在服务器上的$HOME/.vscode-server/bin文件夹中,解压。在wsl中下载不了 vscode 的核心。运行下面两行命令,建立空的$HOME/.vscode-server/bin文件夹。重新运行 wsl与vs的链接即可。

点云算法工程师 3790

stack排序

[Microsoft]对stack上的元素排序,可以使用的方法有pop(), top(), push(), isEmpty(), isFull(). void sort(Stack& stack)57 {58 if(stack.isEmpty())59 return ;60 int temp1=stack.pop();61 sort(sta...

weixin_30840253的博客 501

[Stanford CS217]CUDA中矩阵乘法GEMM优化的最关键点:向量内积和向量外积分别取行和取列

对于矩阵C中的每一个tile,矩阵A与矩阵B中的tile只需要读取一次,这样就可以达到 O(N) 的计算强度。理想情况下性能应当受限于算术吞吐量,确切来说对于一个大型方阵,即 M=N=K ,矩阵乘法的数学操作复杂度为 O(N3) ,而数据量为 O(N2) ,同时计算强度为 N (这里的计算强度可以被理解为同一个数据被重复利用的次数)。GEMM就是指计算 C=A∗B+C ,其中 A 、B和C都是矩阵,A是 M×K 的矩阵,B是 K×N 的矩阵, C是 M×N 的矩阵。这就是向量内积和向量外积的最大区别。

weixin_55035144的博客 1426

测绘无人船避坑指南:云卓H12Pro遥控器接海康摄像头,从网络设置到RTSP流延迟优化全流程

本文详细解析了测绘无人船视频子系统的优化方案,重点介绍海康威视摄像头与云卓H12Pro遥控器的深度适配流程。从网络设置到RTSP流延迟优化,提供了一套经过实测的低延迟(<200ms)解决方案,适用于复杂水域环境下的测绘任务。

weixin_30415113的博客 626

栈排序

栈排序 栈排序。 编写程序,对栈进行排序使最小元素位于栈顶。最多只能使用一个其他的临时栈存放数据,但不得将元素复制到别的数据结构(如数组)中。该栈支持如下操作:push、pop、peek和isEmpty。当栈为空时,peek返回-1。 示例 输入: ["SortedStack", "push", "push", "peek", "pop", "peek"] [[], [1], [2], [], [], []] 输出: [null,null,null,1,null,2] 输入: ["SortedStack

WindRunnerMax 1515

黑猫带你学eMMC协议第9篇:eMMC初始化过程(initial)

本文依据eMMC JEDEC5.1及个人工作经验整理而成,如有错误请留言。 文章为个人辛苦整理,付费内容,禁止私自转载。 文章所在专栏:《黑猫带你学:eMMC协议详解》 1 什么是emmc的初始化 对于小白来说,可能不太明白什么是emmc初始化。举个栗子:当你拿到一个电脑,接上电源,是不是就立马可以用了呢?并不是吧,你还需要去开机,等待电脑启动,配置完各种参数,等出现了电脑桌面,你才能用。那么同样,对于emmc芯片来说,也不是提供电源就能用了,需要输入各种命令后,让其进入到tran state后,才能正.

黑猫奥利奥的博客 6741

c++中使用sort方法排序

编程经常要用到排序,而sort方法是algorithm头文件里的一个标准函数,能进行高效的排序,默认是按元素从小到大排序,省事也省心。 首先sort方法可以对静态的数组进行排序 #include&amp;lt;iostream&amp;gt; using namespace std; int main(){ int a[10] = { 9, 0, 1, 2, 3, 7, 4, 5, 100, 10...

weixin_41038905的博客 1369

【后量子密码】SPHINCS+ 算法(二):签名与验签(附源码分析)

本节介绍SPHINCS+ 算法的密钥生成、签名与验签。nnn:安全参数;www:Winternitz参数,WOTS+签名分解的基底;hhh:超树的高度;ddd:超树中子树的层数;kkk:FORS 树的数量;ttt:FORS 树的叶子节点数。

听雨草堂 4680

paddlehub无法安装,安装报错【Bug完美解决】

paddlehub无法安装,安装报错【Bug完美解决】 我们正在进行一个基于Python的项目开发,该项目需要集成PaddleHub,以利用其丰富的深度学习模型和工具。PaddleHub提供了一种简便的方式来使用预训练模型,以加速开发过程并提高模型效果。 现在paddlehub安装出现问题了,本文彻底解决paddlehub无法安装的问题。

一键难忘的博客 3387

栈排序,队列排序

同学给我出了一个栈排序的题,意思给一个包含无序数的栈,让输出一个顺序排列的栈。 直接排序是不可能的,栈只能在一端进行操作。因此需要借助辅助栈。 思路是将原栈s的数据压入辅助栈s2,辅助栈用于保存最终结果。辅助栈中的元素是有序的。 压栈过程需要比较两个栈栈顶元素大小关系。如果s栈顶小于s2的栈顶元素,则需要找到s2的栈中第一个大于s1栈顶的元素,然后将s2中的元素出栈到s中。最后将s一开始的那...

u012260341的博客 2816

一文读懂 SAP BTP Application Router 的 Resource Files:从 xs-app.json 到本地开发的默认设置

本文详解SAP BTP中Application Router的资源文件配置与本地开发实践。核心包括:xs-app.json定义路由规则与安全策略,package.json声明依赖与启动脚本,resources/存放静态资源,default-services.json和local-destinations.json用于本地模拟云服务。文章通过真实案例展示如何配置静态资源直出、反向代理后端服务,并强调本地开发时的注意事项与常见问题解决路径。关键配置均提供示例代码,帮助开发者快速实现业务应用的部署与联调。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 177

C++实现栈中元素排序

题目:将一个栈中的元素排序,借助另外一个栈!思路:将排序的栈每次出栈一个元素,第一次直接放入缓冲栈中,第二开始直至结束,每个出栈元素都需要跟缓冲栈里面元素比较找到排序位置(缓冲栈这个时候也需要吐栈可以考虑把元素放回到排序栈中待会再放回来),直到所有元素排序完毕。#include <iostream> #include <stack> void sortStack(stack<int>& a) {

Touch_Dream的博客 4463

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

java简单算法_java实现简单的算法

排序大的分类可以分为两种:内排序和外排序。在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序。下面讲的排序都是属于内排序。内排序有可以分为以下几类:(1)、插入排序:直接插入排序、二分法插入排序、希尔排序。(2)、选择排序:简单选择排序、堆排序。(3)、交换排序:冒泡排序、快速排序。(4)、归并排序(5)、基数排序一、插入排序•思想:每步将一个待排序的记录,按...

weixin_39637921的博客 678

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

对一个栈进行排序

只使用一个辅助栈,对一个栈进行升序排列import java.util.Stack;/**

cstlrx的博客 670

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Java用栈实现排序_Java中的栈排序

本篇博客是上一篇博客的延续。在实现图论算法的过程中,需要对栈中的元素进行排序。我使用的是双栈排序算法,实现的是将栈中的元素按从大到小的顺序排列,现将该算法的思路总结如下:1、算法主要涉及到两个栈,stackSrc和stackDes。stackSrc是原始存储数据的栈,简称源栈;stackDes是用来存储排序之后元素的栈,简称目的栈。2、首先判断源栈stackSrc是否为空,如果为空,则抛出异常No...

weixin_30866939的博客 1387

面试题 03.06. 栈排序

栈排序。 编写程序,对栈进行排序使最小元素位于栈顶。最多只能使用一个其他的临时栈存放数据,但不得将元素复制到别的数据结构(如数组)中。该栈支持如下操作:push、pop、peek 和 isEmpty。当栈为空时,peek 返回 -1。 class SortedStack { stack<int> p; public: SortedStack() { ...

yeyueyouhun的博客 140

day14:栈排序

栈排序。编写程序,对栈进行排序使最小元素位于栈顶。最多只能使用一个其他的临时栈存放数据,但不得将元素复制到别的数据结构(如数组)中。pushpoppeek和isEmpty。当栈为空时,peek返回 -1。

the_dry的博客 469

JAVA快速排序栈实现(非递归)

快速排序非递归方法,使用栈实现的,入栈和出栈相当于递归操作 public static void quickSort(int[] arr, int startIndex, int endIndex) { // 用一个集合栈来代替递归的函数栈 Stack<Map<String, Integer>> quickSortStack = new Stack<Map<String, Integer>>(); // 整个

m0_61882402的博客 591

栈系列之 栈排序

使用一个辅助栈完成原始栈的排序:栈顶到栈底从大到小。

一个码农的前三十年 4099

排序算法------栈排序

前言: 栈排序,是利用栈的特性进行排序的,这里就是指先进后出这个特性。 例题 : 这里可以允许用到两个栈,也就是多用一个辅助栈。 具体思路:就是循环遍历元素,当发现入栈的元素x要比栈顶要大的时候,则循环将栈顶小于x的元素放到辅助栈中,然后把x入栈,最后把辅助栈的元素重新入栈。 # include <iostream> # include <algorithm> # include <cstdlib> # include <cstdio> # include

weixin_43743711的博客 2405

数据结构——栈与栈排序

很特别的一种根据栈实现的排序方法

bairui6666的博客 2106

数据结构之栈的实现与排序详解与示例(C, C#, C++)

本文详细介绍了栈的排序方法,包括递归法和辅助栈法,并提供了C, C#, C++三种语言的示例。递归法利用递归将栈顶元素出栈,然后重新插入到正确的位置;辅助栈法则利用一个额外的栈来辅助排序。这两种方法都可以实现栈的排序,但辅助栈法在实际应用中更为常见,因为它避免了递归可能带来的栈溢出问题。

qq_35320456的博客 941

java实现堆栈排序_java-编写程序以按升序对堆栈进行排序

有人可以帮忙看看我的代码吗?非常感谢你的帮助.输入堆栈为[5、2、1、9、0、10],我的代码给出了输出堆栈[0、9、1、2、5、10],9不在正确的位置.import java.util.*;public class CC3_6 {public static void main(String[] args) {int[] data = {5, 2, 1, 9, 0, 10};Stack mySt...

weixin_33726568的博客 300
上一篇: Stack_Queue 两个栈实现一个队列 @CareerCup
下一篇: Stack_Queue 猫狗队列问题 Cat dog queue @CareerCup
chiiis
博客等级 码龄14年 422粉丝 429原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值