
栈的排序
发布日期:2021-05-07 22:02:15
浏览次数:13
分类:精选文章
本文共 1478 字,大约阅读时间需要 4 分钟。
1. 问题描述:
请编写一个程序,按升序对栈进行排序(即最大元素位于栈顶),要求最多只能使用一个额外的栈存放临时数据,但不得将元素复制到别的数据结构中。
给定一个int[] numbers(C++中为vector<int>),其中第一个元素为栈顶,请返回排序后的栈。请注意这是一个栈,意味着排序过程中你只能访问到第一个元素。 测试样例: [1,2,3,4,5] 返回:[5,4,3,2,1]2. 思路分析:
我们可以使用额外的栈来进行数据的缓冲,当右边的栈(目标栈)的元素为空的时候我们需要将左边的栈(原栈)中的元素直接压入到右边的栈中,右边的栈不为空的情况下,我们需要弹出左边栈顶的元素,与右边栈顶元素进行比较如果大于等于右边栈顶的元素,直接压入到右边的栈中,假如小于,那么我们需要把右边栈中所有大于左边栈弹出来的元素都压入到左边的堆栈中,所以这里可以使用一个while循环进行右边元素压入到左边元素的操作,等到while循环结束那么将弹出来的元素压入到右边的堆栈中,当所有的元素都压入到右边的堆栈中那么我们就得到了排好序之后的目标栈了
思路清楚之后代码就比较简单了,其中主要是一些栈的方法的调用和简单的逻辑判断
这里要注意不要混淆栈顶元素的弹出方法pop()和栈顶元素的查看方法peek(),一个是弹出栈顶元素,另外一个是查看栈顶元素但是不弹出
3. 代码如下:
import java.util.Stack;public class Main{ public static void main(String[] args) { int arr[] = {10, 5, 4, 14, 3, 2, 1, 8}; twoStackSort(arr); } private static void twoStackSort(int[] arr){ Stacksource = new Stack (); for(int i = 0; i < arr.length; i++){ source.push(arr[i]); } Stack target = twoStackSort(source); while(!target.isEmpty()){ System.out.println(target.pop()); } } private static Stack twoStackSort(Stack source) { Stack target = new Stack (); while(!source.isEmpty()){ if(target.isEmpty()){ target.push(source.pop()); }else{ int v = source.pop(); if(target.peek() <= v){ target.push(v); }else{ while(!target.isEmpty() && target.peek() > v){ source.push(target.pop()); } target.push(v); } } } return target; }}
发表评论
最新留言
关注你微信了!
[***.104.42.241]2025年03月22日 08时26分18秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
桌面图标的自动排列图标
2019-03-04
第十一届蓝桥杯python组第二场省赛-数字三角形
2019-03-04
手机号码(数位dp-dfs)
2019-03-04
数字三角形的无返回值的深度优先搜索解法
2019-03-04
完全背包问题的简化思路
2019-03-04
Jquery添加元素
2019-03-04
Jquery使用需要下载的文件
2019-03-04
Spring中如何传递参数的问题
2019-03-04
BST中某一层的所有节点(宽度优先搜索)
2019-03-04
广度优先搜索
2019-03-04
对于递归的理解
2019-03-04
二分查找(递归)
2019-03-04
猜字母
2019-03-04
Linux网络环境配置(设置ip地址)
2019-03-04
Idea使用Spring Initializr来快速创建springboot项目
2019-03-04
C++邻接表存储图的深度优先搜索
2019-03-04
Dijkstra算法的总结
2019-03-04
前后端通信问题 —— SpringBoot+LayUI
2019-03-04
ubuntu中安装scikit-learn
2019-03-04