package com.langsin.test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Stack;
/*
使用栈做一个排序,现在又一个List集合里面存放了若干个数据,现在要把这些输入放入到栈中,要求
放入到栈中的数据最小的在最下面,依次类推,最大的就是在最上面
在放入到栈中的时候,进行排序,而不是排好顺序在放
思路:用栈的特性 一共三个栈 将list的取出(remove最后一个元素)放入 新栈中a , 放b的时候将其
与a比较 比此数大的都弹出来 然后将次数放进去之后 将次数放进栈中
新栈 升序排列 当链表中的数9 大于 要放的值0时 9大 则9放入栈中
0 小于1 将 将1直接放入栈中 或者链表的数值取完了的时候也是直接放入
Object remove():获取队列头部的元素 并且删除该元素 后面的元素往前移动但会占用性能,所以取队尾
如果用用remove(list.size)取最后一个 这样value和stack值比较 因为是要求最终的栈是最小的值在下面 所以当value值大于stack弹出的值时直接加入栈
小于的时候 将stack值弹出来从先放到临时的stack中*/
public class stackSort {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1, 11, 3, 7, 8, 21, 18);
List<Integer> dataList = new ArrayList<>();
for (Integer value : list) {
dataList.add(value);
}
sortList(dataList);
System.out.println(dataList);
}
/**
* 使用栈存储容器来完成List集合的排序操作
* 首先从传入的list集合中,将所有的元素取出,存储在另外一个集合(newlist)中
* 然后在往这个list集合中,重新添加元素,在添加的过程中完成排序操作,使用栈stack来完成排序(此时stack时临时的)
* 升序排序
*/
public static void sortList(List<Integer> list){
List<Integer> newlist=new ArrayList<>();
Stack<Integer> stack=new Stack<>();
while (list.size()>0){
newlist.add(list.remove(list.size()-1));
}
while (newlist.size()>0){//?/????????????????????????
//将newlist从最后一个值开始取 从newlist里面取出 放入栈或者放回list
Integer value=newlist.remove(newlist.size()-1);
//如果list没有元素 说明此时都在newlist里面
if(list.size()==0){
list.add(value);
}else{
while (list.size()>0){
//list集合中有其他的元素,此时要将newlist的元素放回list 集合中的元素进行比较
if(value<list.get(list.size()-1)){//也取的是链表的尾部
//因为是升序 大的在上面 所以要
stack.push(list.remove(list.size()-1));//将list的放到栈中
}else{
//比list大加上就可以
break;
}
}
list.add(value);
//将临时放在栈的那个元素放回!!!!
while (stack.size()>0){
list.add(stack.pop());
}
}
}
}
}
|