日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构与算法--利用栈实现队列

發布時間:2023/12/4 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构与算法--利用栈实现队列 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

利用棧實現隊列

  • 上一節中說明了棧的特點 后進先出,我們用數組的方式實現了棧的基本操作api,因此我們對棧的操作是不考慮排序的,每個api的操作基本都是O(1)的世界,因為不考慮順序,所以找最大,最小值,需要O(n)時間
  • 還有與棧相對于的一種數據結構,那就是隊列了,隊列特點是先進先出,即第一個進去隊列的元素會第一個出來,
  • 棧和隊列雖然特點上相反,當他們也有相互聯系,我們利用棧解決如下隊列的問題:

問題

  • 用兩個棧實現一個隊列,隊列的聲明如下:實現兩個函數append,del,分別完成隊尾插入節點, 隊列頭部刪除節點的功能。
  • 隊列對象定義:
/*** @author liaojiamin* @Date:Created in 11:37 2021/3/9*/ 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,如果是不同操作,則反轉在對非空棧進行操作,如果是相同操作類型,則直接對非空棧進行操作,無需反轉

  • 代碼實現:
/*** 利用兩個棧實現隊列* @author liaojiamin* @Date:Created in 11:35 2021/3/9*/ public class StackImpleQueue {private MyQueue myQueue = new MyQueue();/*** 添加元素到隊列* */public void append(Integer item){if(isEmpty()){myQueue.getMyStack1().push(item);return;}//上次是append,無需changeboolean needChange = !myQueue.isAdd();MyStack<Integer> notEmpty = change(needChange);notEmpty.push(item);}/*** 從隊列中刪除位置* */public Integer del(){if(isEmpty()){return -1;}//上次是add則需要changeMyStack<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());}}

上一篇:數據結構與算法–簡單棧實現及其應用
下一篇:數據結構與算法–鏈表實現以及應用

總結

以上是生活随笔為你收集整理的数据结构与算法--利用栈实现队列的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。