Java中基于栈和队列的排序算法

题目1:使用一个辅助栈和一些附加非数组变量将堆栈S中的元素按升序存储.

题目2:使用一个辅助队列和一些附加非数组变量将队列Q中的元素按升序存储.

1.用Java实现,首先使用链表LinkedList构造栈数据结构.

import java.util.LinkedList;public class IntStack {   private LinkedList sTorage = new LinkedList ();   /** 入栈 */   public void push(int v) {     sTorage.addFirst(v);   }   /** 出栈,但不删除 */   public int peek() {     return sTorage.getFirst();   }   /** 出栈 */   public int pop() {     return sTorage.removeFirst();   }   /** 栈是否为空 */   public boolean empty() {     return sTorage.isEmpty();   }   /** 打印栈元素 */   public String toString() {     return sTorage.toString();   }}

2.使用两个栈进行排序操作.

2.1方法init(int[] ints, IntStack stack)将数据存入栈1;

2.2方法sort()进行排序,主要算法是:

[1]sizeOne和sizeTwo记录当前两个栈中待排序的数据数目;

[2]做循环,直到某个栈中待排序的数据数目为1,说明排序完成;

[3]排序的过程为,

[3.1]首先从栈1中依次取出所由未排序数据,找到最大者,存入max,而其余入栈2;

[3.2]此时已经找到数据的最大者;

[3.3]再次,从栈2中依次取出所由未排序数据,找到最大者,存入max,而其余入栈1;

[3.4]此时已经找到数据的次大者;

[3.5]依次交替往复,直到满足中止条件[2];

[3.6]此时sizeOne和sizeTow中必然一个为0,一个为1;

2.3 打印数据,依据[3.6]从为值为1的那个栈中开始取一个数据,再从另一个栈中取一个数 据,如此交替直到取完两个栈中所由数据;

2.4测试,执行程序输出:

Original:3 1 7 1Result :1 1 3 7Original:3 1 9Result :1 3 9public class StackSort {   private IntStack stackOne;   private IntStack stackTwo;   private int size = 0;   private static final int START_ONE = 1;   private static final int START_TWO = 2;   public StackSort(int[] ints) {     stackOne = new IntStack();     stackTwo = new IntStack();     init(ints, stackOne);   }   private void init(int[] ints, IntStack stack) {     System.out.print("Original:");     for (int i : ints) {       System.out.print(i + " ");       stack.push(i);       size++;     }     System.out.println();   }   public int sort() {     if (size == 0)       throw new UnsupportedOperationException("Stack empty");     int sizeOne = size;     int sizeTwo = 0;     while (sizeOne != 1 && sizeTwo != 1) {       int max = stackOne.pop();       sizeOne--;       while (sizeOne > 0) {         int value = stackOne.pop();         if (value > max) {           stackTwo.push(max);           max = value;         } else           stackTwo.push(value);         sizeOne--;         sizeTwo++;       }       stackOne.push(max);       if (sizeTwo == 1)         return START_TWO;       max = stackTwo.pop();       sizeTwo--;       while (sizeTwo > 0) {         int value = stackTwo.pop();         if (value > max) {           stackOne.push(max);           max = value;         } else           stackOne.push(value);         sizeTwo--;         sizeOne++;       }       stackTwo.push(max);     }     // sizeOne和sizeTow中必然一个为0,一个为1     return (sizeOne > sizeTwo ? START_ONE : START_TWO);   }   public void printResult(int start) {     System.out.print("Result :");     if (start == START_ONE)       printStack(stackOne, stackTwo);     else       printStack(stackTwo, stackOne);     System.out.println();   }   private void printStack(IntStack one, IntStack two) {     while (one.empty() == false && two.empty() == false) {       System.out.print(one.pop() + " ");       System.out.print(two.pop() + " ");     }     if (one.empty() == false)       System.out.print(one.pop() + " ");   }   public static void main(String[] args) {     StackSort ssort = new StackSort(new int[] { 3, 1, 7, 1 });     ssort.printResult(ssort.sort());     ssort = new StackSort(new int[] { 3, 1, 9 });     ssort.printResult(ssort.sort());   }}

3.队列的排序算法

每次循环取源队列数据,找出最大者加入目标队列,其余放回源队列,直到源队列空,排序完 成(这种算法适合于实现约瑟夫环).如果每次取出的最大值直接打印,则不需要额外辅助队 列.

3.1所使用的队列数据结构

import java.util.LinkedList;import java.util.Queue;public class IntQueue {   private Queue sTorage = new LinkedList ();   /** 将指定的元素插入队尾 */   public void offer(int v) {     sTorage.offer(v);   }   /** 检索,但是不移除队列的头,如果此队列为空,则返回 null */   public int peek() {     return sTorage.peek();   }   /** 检索并移除此队列的头,如果队列为空,则返回 null */   public int poll() {     return sTorage.poll();   }   /** 队列是否为空 */   public boolean empty() {     return sTorage.isEmpty();   }   /** 打印队列元素 */   public String toString() {     return sTorage.toString();   }}

3.2队列排序

public class QueueSort {   private IntQueue queueOne;   private IntQueue queueTwo;   private int size = 0;   public QueueSort(int[] ints) {     queueOne = new IntQueue();     queueTwo = new IntQueue();     init(ints, queueOne);   }   private void init(int[] ints, IntQueue queue) {     System.out.print("Original:");     for (int i : ints) {       System.out.print(i + " ");       queue.offer(i);       size++;     }     System.out.println();   }   public void sort() {     if (size == 0)       throw new UnsupportedOperationException("Stack empty");     int sizeOne = size;     while (sizeOne > 0) {       int max = queueOne.poll();       int turn = sizeOne - 1;//当前轮次的待比较元素数       while (turn > 0) {         int value = queueOne.poll();         if (value > max) {           queueOne.offer(max);           max = value;         } else           queueOne.offer(value);         turn--;       }       queueTwo.offer(max);       sizeOne--;     }   }   public void printResult() {     System.out.print("Result :");     while (queueTwo.empty() == false)       System.out.print(queueTwo.poll() + " ");     System.out.println();   }   public static void main(String[] args) {     QueueSort qsort = new QueueSort(new int[] { 3, 1, 7, 1 });     qsort.sort();     qsort.printResult();     qsort = new QueueSort(new int[] { 3, 1, 9 });     qsort.sort();     qsort.printResult();   }}

人生就像一杯没有加糖的咖啡,喝起来是苦涩的,

Java中基于栈和队列的排序算法

相关文章:

你感兴趣的文章:

标签云: