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

来源:互联网 发布:iphone手机称重软件 编辑:程序博客网 时间:2024/04/16 19:29

用一个栈实现另一个栈的排序

题目:

一个栈元素的类型为整数,现在要想将该栈从顶到底按从大到小的顺序排列,只允许申请一个栈,除此之外,

可以申请一个变量,可以申请额外的变量,但是不能申请额外的数据结构,如何完成排序


思路:

我们需要排序的栈为stack,然后我们申请一个栈记为help,在stack上面执行pop()操作,弹出的元素记为cur
 如果cur小于或者等于栈顶元素,则将cur压入help,
 如何cur大于help的栈顶元素,则将help的元素涿步弹出,涿一压入stack,直到cur小于或等于help的栈顶元素、再讲
 cur压入help


代码:

import java.util.Stack;/** * 一个栈元素的类型为整数,现在要想将该栈从顶到底按从大到小的顺序排列,只允许申请一个栈,除此之外, * 可以申请一个变量,可以申请额外的变量,但是不能申请额外的数据结构,如何完成排序 * @author Think * 思路:我们需要排序的栈为stack,然后我们申请一个栈记为help,在stack上面执行pop()操作,弹出的元素记为cur * 如果cur小于或者等于栈顶元素,则将cur压入help, * 如何cur大于help的栈顶元素,则将help的元素涿步弹出,涿一压入stack,直到cur小于或等于help的栈顶元素、再讲 * cur压入help */public class SortStackByStack {     public static void main(String[] args) {Stack<Integer> s=new Stack<Integer>();s.push(3);s.push(2);s.push(5);s.push(4);s.push(1);s=sortStackbyStack(s);while(!s.isEmpty()){System.out.println(s.pop());}}     public static Stack<Integer> sortStackbyStack(Stack<Integer> stack){     Stack<Integer> help=new Stack<Integer>();     while(!stack.isEmpty()){     int cur=stack.pop();     while(!help.isEmpty() && cur>help.peek()){     stack.push(help.pop());     }//     help.push(stack.pop());  这个地方要是写了就pop了2次,显然不正确     help.push(cur);     }     while(!help.isEmpty()){     stack.push(help.pop());     }     return stack;     }     /**      * 如果我采用下面的方法,cur<=help.peek(); 然后去执行help.pop();很明显help是空的,会报错      * 所以我们应该采取相反的思路去解决这个问题,cur>help.peek(),这个时候有确保help里面没有数据的话      * 会把stack的pop();出来的数据压倒help里面,下次注意      *///     public static Stack<Integer> sortStackbyStack1(Stack<Integer> stack){//     Stack<Integer> help=new Stack<Integer>();//     while(!stack.isEmpty()){//     int cur=stack.pop();//     while(!help.isEmpty() && cur<=help.peek()){//    help.push(cur);//     }////     help.push(stack.pop());  这个地方要是写了就pop了2次,显然不正确//     stack.push(help.pop()); //     }//     while(!help.isEmpty()){//     stack.push(help.pop());//     }//     return stack;//     }}


打印台输出:

54321


总结:

当栈里面没有元素的时候,是不能pop()的,我们编程的时候应该注意,我之前就患了这个错误,然后就是用一个栈排序的思想是,需要从大到小的话,我们需要先从小到大的排列,但是为了达到从上到下的从小到大排列,必须压进去的最大就往底部压,知道比它小,然后压进去的时候,必须之前要有序。




0 0
原创粉丝点击