程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java中基於棧和隊列的排序算法

Java中基於棧和隊列的排序算法

編輯:關於JAVA

題目1:使用一個輔助棧和一些附加非數組變量將堆棧S中的元素按升序存儲.

題目2:使用一個輔助隊列和一些附加非數組變量將隊列Q中的元素按升序存儲.

1.用Java實現,首先使用鏈表LinkedList構造棧數據結構.

import java.util.LinkedList;
public class IntStack {
   private LinkedList<Integer> storage = new LinkedList<Integer> ();
   /** 入棧 */
   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 1
Result :1 1 3 7
Original:3 1 9
Result :1 3 9
public 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<Integer> storage = new LinkedList<Integer> ();
   /** 將指定的元素插入隊尾 */
   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();
   }
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved