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)。这些操作共同构成了栈的行为契约。 阅读详情

相关推荐

MaxENT生态位模型实战:从数据准备到论文发表的完整指南

本文提供MaxENT生态位模型从数据准备到论文发表的完整实战指南,涵盖物种分布数据处理、环境变量筛选、参数优化及结果可视化等关键步骤。特别介绍如何通过R语言进行高级建模优化,提升模型AUC值,并分享海洋生物专题研究中的数据处理技巧。适合生态学研究者快速掌握这一强大的物种分布预测工具,产出高质量研究成果。

tensor9flow的博客 302

优化stack元素排序

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

EaShion1994的专栏 772

移植 lwip,在 windows 内核构建一个 TCPIP 协议栈

移植 lwip,在 windows 内核构建一个 TCPIP 协议栈 亲,当你点开看这篇文章,就说明你知道我想要干什么事情,或者说,你知道在 Windows 的内核种绕开它的网络协议,再独立构建一个网络协议栈的意义。如果你要问我有 windows 系统的网络协议栈不用,移植 lwip 有什么意义,那么你可以关闭链接走人了,因为这篇文章不适合你,它不是讲 lwip 移植原理的。 经常关注我的博客的朋...

oRbIt 的专栏 3577

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

怎么调用onenet平台的API从而读取我们的设备数据和下发命令,做到控制开关

怎么调用onenet平台的API从而读取我们的设备数据和下发命令,做到控制开关 1、首先是怎么读取数据 读取的API是:http://api.heclouds.com/devices/datapoints?devIds=629063002 其中devids这个指的是你的设备ID 然后在我们的headers里面添加一些必要参数,就可以调用了 其中api-key的是你产品里面的master-apikey 把我们的参数写好就可以调用了,选择get方式,点击发送 这个value就是我们需要获取到的参数值了,

zyh960的博客 2万+

Python 神经计算实训 实训答案分享

【代码】Python 神经计算实训 实训答案分享。

2403_89314916的博客 347

栈排序

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

WindRunnerMax 1515

Calibre 3Dstack --每日一个命令day27【overlap】(3-27)

本文介绍了Calibre3Dstack中overlap命令的使用方法。该命令用于检查两个已放置层之间的重叠量是否符合要求,支持设置检查名称、层类型、堆叠范围、检查方向等参数。关键参数包括:-constraint指定重叠约束条件,-exact控制百分比精度,-by_area切换为面积检查模式,-intersection报告相交区域。检查结果可通过RVE选项定制显示方式,适用于3D堆叠设计中的层间重叠验证场景。

u013620135的博客 112

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

在 SAP BTP 中通过 MTA 自动创建 Service Broker 的原理与实战

本文探讨了如何在SAP BTP的Cloud Foundry环境中通过MTA部署自动创建和注册Service Broker。传统手动注册方式存在依赖管理员、环境一致性差等问题。通过MTA部署可实现自动化Broker注册,利用占位符生成安全凭证,并确保平台端与应用端认证一致。文章详细解析了关键配置参数,包括create-service-broker标志、Broker名称、认证凭据和访问URL的设置方法。这种基础设施即代码(IaC)方式能提升DevOps实践水平,使服务注册成为应用部署流水线的有机组成部分。

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

JavaScript实现量化交易策略(附完整源码)

JavaScript实现量化交易策略(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 721

栈排序,队列排序

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

u012260341的博客 2816

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C++实现栈中元素排序

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

Touch_Dream的博客 4463

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

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

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

weixin_39637921的博客 678

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

对一个栈进行排序

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

cstlrx的博客 670

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、付费专栏及课程。

余额充值