1. 程式人生 > >如何用陣列實現佇列和棧?

如何用陣列實現佇列和棧?

用陣列結構實現大小固定的棧和佇列,這是一個面試的常考題目,也是一個比較簡單的題目。

1.實現棧結構:棧結構是先進後出的,只需要一個數組和一個記錄位置的變數size,當進來一個元素,size就++,出去一個元素size就–。

2.實現佇列結構:相對棧結構要難搞一些,佇列的先進先出的,需要一個數組和三個變數,size記錄已經進來了多少個元素,in記錄剛進來的元素應該放在哪個位置,out表示使用者要求彈出的元素所在的位置。size的作用不止於此,它還是in與out 的操作的關鍵資訊,使得in與out解耦,避免的很多的麻煩,好像書本講的是沒有size這個變數的。當in或者out達到底部的時候就跳回0處。

  1. /**
  2. * 固定陣列實現一個佇列
  3. * 佇列先進先出,方法有push,pull,peek
  4. */
  5. public class C02_ArrayToQueue {
  6. public static class MyQueue{
  7. private int out;//新進來的數 放這
  8. private int in;//使用者要求彈出的數
  9. private int size;//已經進佇列的個數
  10. private int arr[];
  11. public MyQueue(int iniSize){
  12. arr = new int[iniSize];
  13. size = 0
    ;
  14. in = 0;
  15. out = 0;
  16. }
  17. public void push(int num){
  18. if(size==arr.length){
  19. throw new RuntimeException(“the queue is full!”);
  20. }
  21. size++;//大小擴充套件一個
  22. arr[in] = num;//賦值
  23. in = in==arr.length-1 ? 0 : in+1;//如果已經到達陣列末尾就重新等於0
  24. }
  25. public int pull(){
  26. if(size==0){
  27. throw new RuntimeException(“the queue is empty!”);
  28. }
  29. size–;
  30. int t = out;//記錄
  31. out = out==arr.length-1 ? 0 : out+1;//如果已經到達陣列末尾就重新等於0
  32. return arr[t];
  33. }
  34. public int peek(){
  35. if(size==0){
  36. throw new RuntimeException(“the queue is empty!”);
  37. }
  38. return arr[out];
  39. }
  40. }
  41. public static void main(String[] args) {
  42. int iniSize = 3;
  43. MyQueue myQueue = new MyQueue(iniSize);
  44. myQueue.push(12);
  45. myQueue.push(13);
  46. myQueue.push(15);
  47. System.out.println(myQueue.pull());
  48. System.out.println(myQueue.pull());
  49. System.out.println(myQueue.pull());
  50. myQueue.push(23);
  51. myQueue.push(24);
  52. System.out.println(myQueue.pull());
  53. System.out.println(myQueue.peek());
  54. }
  55. }

  1. /**
  2. * 固定陣列實現棧結構
  3. * 實現方法push,pop,peek
  4. * 當越界的時候丟擲一個執行時異常
  5. * 簡單面試題
  6. */
  7. public class C01_ArrayToStack {
  8. public static class MyStack{
  9. private int size;//指標位置,也表示棧已經壓了多少
  10. private int[]arr;
  11. MyStack(int iniSize){//構造方法初始化陣列
  12. arr = new int[iniSize];
  13. size = 0;
  14. }
  15. public void push(int num){
  16. if(size == arr.length){
  17. throw new RuntimeException("棧下標越界!");
  18. }
  19. arr[size++] = num;
  20. }
  21. public int pop(){
  22. if(size == 0){
  23. throw new RuntimeException("棧中已經沒有元素可以彈出!");
  24. }
  25. return arr[--size];
  26. }
  27. public int peek(){
  28. if(size == 0){
  29. throw new RuntimeException("棧中已經沒有元素可以彈出!");
  30. }
  31. return arr[size];
  32. }
  33. }
  34. public static void main(String[] args) {
  35. int len = 13;
  36. MyStack myStack = new MyStack(len);
  37. for (int i = 0; i < len; i++) {
  38. myStack.push(i);
  39. }
  40. for (int i = 0; i < len; i++) {
  41. System.out.println(myStack.pop());
  42. }
  43. }
  44. }