生活随笔
收集整理的這篇文章主要介紹了
数据结构与算法--利用栈实现队列
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
利用棧實現隊列
- 上一節中說明了棧的特點 后進先出,我們用數組的方式實現了棧的基本操作api,因此我們對棧的操作是不考慮排序的,每個api的操作基本都是O(1)的世界,因為不考慮順序,所以找最大,最小值,需要O(n)時間
- 還有與棧相對于的一種數據結構,那就是隊列了,隊列特點是先進先出,即第一個進去隊列的元素會第一個出來,
- 棧和隊列雖然特點上相反,當他們也有相互聯系,我們利用棧解決如下隊列的問題:
問題
- 用兩個棧實現一個隊列,隊列的聲明如下:實現兩個函數append,del,分別完成隊尾插入節點, 隊列頭部刪除節點的功能。
- 隊列對象定義:
public class MyQueue {private MyStack
<Integer> myStack1
;private MyStack
<Integer> myStack2
;private boolean isAdd
;public MyQueue(){myStack1
= new MyStack<>();myStack2
= new MyStack<>();isAdd
= false;}public boolean isAdd() {return isAdd
;}public void setAdd(boolean add
) {isAdd
= add
;}public MyStack
<Integer> getMyStack1() {return myStack1
;}public void setMyStack1(MyStack
<Integer> myStack1
) {this.myStack1
= myStack1
;}public MyStack
<Integer> getMyStack2() {return myStack2
;}public void setMyStack2(MyStack
<Integer> myStack2
) {this.myStack2
= myStack2
;}
}
分析
- 我們需要通過stack1與stack2實現先進先出的隊列MyQueue,我們用一個實際案例來分析,
- 首先add 一個元素a到stack1中,在接著,b,c還是到stack1中,此時stack1 中有{a,b,c},stack2是空的,如下圖:
- 此時我們需要刪除一個元素。按隊列先進先出原則,a需要比b,c先出去,但是此時stack1中c是在棧頂。我們需要反轉stacl1
- 如上分析,我們將stack1 中所有元素彈出并依次加入stack2,那么就完成反轉的功能,在彈出stack2 中第一個元素。實現刪除功能
- 繼續刪除我們還是直接操作stack2即可
- 這時候再來添加操作,因為需要添加到隊尾,此時不能添加到stack2,我們只能再次反轉,添加到stack1 中。
- 總結:每次add操作或者del操作之前,判斷上次操作是add還是del,如果是不同操作,則反轉在對非空棧進行操作,如果是相同操作類型,則直接對非空棧進行操作,無需反轉
public class StackImpleQueue {private MyQueue myQueue
= new MyQueue();public void append(Integer item
){if(isEmpty()){myQueue
.getMyStack1().push(item
);return;}boolean needChange
= !myQueue
.isAdd();MyStack
<Integer> notEmpty
= change(needChange
);notEmpty
.push(item
);}public Integer
del(){if(isEmpty()){return -1;}MyStack
<Integer> notEmpty
= change(myQueue
.isAdd());return notEmpty
.pop();}public boolean isEmpty(){return myQueue
.getMyStack1().isEmpty() && myQueue
.getMyStack2().isEmpty();}public MyStack
<Integer> change(boolean needChange
){if(isEmpty()){return myQueue
.getMyStack1();}MyStack
<Integer> emptyStack
= myQueue
.getMyStack1().isEmpty() ? myQueue
.getMyStack1() : myQueue
.getMyStack2();MyStack
<Integer> notEmptyStack
= myQueue
.getMyStack1().isEmpty() ? myQueue
.getMyStack2() : myQueue
.getMyStack1();if(needChange
){while (!notEmptyStack
.isEmpty()){emptyStack
.push(notEmptyStack
.pop());}myQueue
.setAdd(!myQueue
.isAdd());return emptyStack
;}return notEmptyStack
;}public static void main(String
[] args
) {StackImpleQueue stackImpleQueue
= new StackImpleQueue();stackImpleQueue
.append(1);stackImpleQueue
.append(2);stackImpleQueue
.append(3);System
.out
.println(stackImpleQueue
.del());System
.out
.println(stackImpleQueue
.del());stackImpleQueue
.append(4);System
.out
.println(stackImpleQueue
.del());System
.out
.println(stackImpleQueue
.del());}}
上一篇:數據結構與算法–簡單棧實現及其應用
下一篇:數據結構與算法–鏈表實現以及應用
總結
以上是生活随笔為你收集整理的数据结构与算法--利用栈实现队列的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。