1. 程式人生 > >劍指Offer面試題:6.用兩個棧實現佇列

劍指Offer面試題:6.用兩個棧實現佇列

一、題目:用兩個棧實現佇列

題目:用兩個棧實現一個佇列。佇列的宣告如下,請實現它的兩個函式appendTail和deleteHead,分別完成在佇列尾部插入結點和在佇列頭部刪除結點的功能。

  原文是使用C++結合模板實現的定義,這裡我們採用C#結合泛型來實現這個佇列的定義,我們要實現的就是兩個方法:AppendTail與DeleteHead

    public class CQueue<T>
    {
        private Stack<T> stack1;
        private Stack<T> stack2;

        
public CQueue() { this.stack1 = new Stack<T>(); this.stack2 = new Stack<T>(); } public void AppendTail(T item) { } public T DeleteHead() { } }

二、解題思路

  一個佇列包含了兩個棧stack1和stack2,因此這道題的意圖是要求我們操作這兩個“先進後出”的棧實現一個“先進先出”的佇列

CQueue。對於兩個棧而言,對於插入操作,不妨假設都先插入到stack1,也就實現了入隊操作。但是出隊操作,則需要藉助stack2的過渡:

  當stack2中不為空時,在stack2中的棧頂元素是最先進入佇列的元素,可以彈出。如果stack2為空時,我們把stack1中的元素逐個彈出並壓入stack2。由於先進入佇列的元素被壓到stack1的底端,經過彈出和壓入之後就處於stack2的頂端了,又可以直接彈出。下圖展示了一個使用兩個棧實現佇列的例項:

三、解決問題

3.1 程式碼實現

    public void AppendTail(T item)
    {
        stack1.Push(item);
    }

    
public T DeleteHead() { if(stack2.Count <= 0) { while(stack1.Count > 0) { T item = stack1.Pop(); stack2.Push(item); } } if(stack2.Count == 0) { throw new Exception("The queue is empty!"); } T head = stack2.Pop(); return head; }

  借用作者的話:本題解法的程式碼雖然只有只有20幾行程式碼,但形成正確的思路卻不容易

3.2 單元測試

  (1)往空的佇列裡新增、刪除元素

    [TestMethod]
    public void CQueueTest1()
    {
        CQueue<char> queue = new CQueue<char>();
        queue.AppendTail('a');
        queue.AppendTail('b');
        queue.AppendTail('c');

        char head = queue.DeleteHead();
        Assert.AreEqual(head, 'a');
    }

    [TestMethod]
    public void CQueueTest2()
    {
        CQueue<char> queue = new CQueue<char>();
        queue.AppendTail('a');
        queue.AppendTail('b');
        queue.AppendTail('c');

        char head = queue.DeleteHead();
        head = queue.DeleteHead();

        Assert.AreEqual(head, 'b');
    }

  (2)往非空的佇列裡新增、刪除元素

    [TestMethod]
    public void CQueueTest3()
    {
        CQueue<char> queue = new CQueue<char>();
        queue.AppendTail('a');
        queue.AppendTail('b');
        queue.AppendTail('c');

        char head = queue.DeleteHead();
        head = queue.DeleteHead();

        queue.AppendTail('d');
        head = queue.DeleteHead();

        Assert.AreEqual(head, 'c');
    }

    [TestMethod]
    public void CQueueTest4()
    {
        CQueue<char> queue = new CQueue<char>();
        queue.AppendTail('a');
        queue.AppendTail('b');
        queue.AppendTail('c');

        char head = queue.DeleteHead();
        head = queue.DeleteHead();

        queue.AppendTail('d');
        head = queue.DeleteHead();

        queue.AppendTail('e');
        head = queue.DeleteHead();

        Assert.AreEqual(head, 'd');
    }

  (3)連續刪除元素直至佇列為空

    [TestMethod]
    public void CQueueTest5()
    {
        CQueue<char> queue = new CQueue<char>();
        queue.AppendTail('a');
        queue.AppendTail('b');
        queue.AppendTail('c');

        char head = queue.DeleteHead();
        head = queue.DeleteHead();

        queue.AppendTail('d');
        head = queue.DeleteHead();

        queue.AppendTail('e');
        head = queue.DeleteHead();
        head = queue.DeleteHead();

        Assert.AreEqual(head, 'e');
    }

  單元測試的結果如下圖所示:

  程式碼覆蓋率結果如下圖所示,可以看到,還需要繼續增加測試用例才能使得覆蓋率達到100%:

作者:周旭龍

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連結。

相關推薦

Offer試題6.實現佇列

一、題目:用兩個棧實現佇列 題目:用兩個棧實現一個佇列。佇列的宣告如下,請實現它的兩個函式appendTail和deleteHead,分別完成在佇列尾部插入結點和在佇列頭部刪除結點的功能。   原文是使用C++結合模板實現的定義,這裡我們採用C#結合泛型來實現這個佇列的定義,我們要實現的就是兩

offer第五題】實現佇列

 棧的實現是先進後出,佇列是先進先出。思路就是第一個棧的元素按次序出棧,然後第二個棧依次入棧,然後出棧。 import java.util.Stack; public class Solution

offer(五)之 實現佇列

題目描述 用兩個棧來實現一個佇列,完成佇列的Push和Pop操作。 佇列中的元素為int型別。 思路 個人的笨方法根大神的比還是差很多。。。 大神的方法:stack1用於push ,stack2 用於pop。分析pop的話,當stack2空了,那麼要把stack1的資料搬過去。s

offer第五題【實現佇列】c++實現

題目描述 用兩個棧來實現一個佇列,完成佇列的Push和Pop操作。 佇列中的元素為int型別。 這個題解法應該比較多 我是用stack1存的push就是正常push,主要改寫pop()方法。 pop()就把stack1全部放入stack2取出棧頂的值然後刪掉,最後再把stack2放到stack1。

Offer試題16.合併排序的連結串列

PS:這也是一道出鏡率極高的面試題,我相信很多童鞋都會很眼熟,就像於千萬人之中遇見不期而遇的人,沒有別的話可說,唯有輕輕地問一聲:“哦,原來你也在這裡? ” 一、題目:合併兩個排序的連結串列 題目:輸入兩個遞增排序的連結串列,合併這兩個連結串列並使新連結串列中的結點仍然是按照遞增排序的。例如輸入下

offer_第五題_實現佇列

平臺 牛客網 語言 python2.7.3 作業內容 題目描述 用兩個棧來實現一個佇列, 完成佇列的 Push 和 Pop 操作。 佇列中的元素為 int 型別。 題目理解 什麼是棧? 棧(有時稱為 “後進先出棧”)是一個項的有序集合,這種排序原則有時被稱為 LI

牛客網線上程式設計專題《offer-試題17》合併排序的連結串列

題目連結: 題目描述: 解題思路: (1)方法一: 修改兩個待合併連結串列的引用域,使它們稱為一個有序的連結串列list3。具體思路如下圖所示: 已經AC的程式碼: public class MergeLinkedList { // 定義結點

offer——試題15.2:判斷整數m和n的二進制中相差多少位

end aps alt 試題 namespace different hide 判斷 img 1 #include"iostream" 2 using namespace std; 3 4 int CountDifferentBit(int m,int n)

offer試題9實現佇列

題目:用兩個棧實現一個佇列。佇列的宣告如下,請實現它的兩個函式appendTail 和deleteHead ,分別完成在佇列尾部插入節點和在佇列頭部刪除節點的功能。 template <typename T> class CQueue { public: CQueue(vo

offer試題9實現佇列佇列模擬

 題目描述: 用兩個棧來實現一個佇列,完成佇列的Push和Pop操作。 佇列中的元素為int型別。 思路一:有點死腦筋,每次pop後都預設下次是push操作,,,,。233主要是由於沒把握好兩個棧模擬時入隊和出隊的時機。考慮stack1和stack2的大小和入隊出隊的關係即可改

offer python】試題7實現佇列

題目連結 題目描述 用兩個棧來實現一個佇列,完成佇列的Push和Pop操作。 佇列中的元素為int型別。 solution class Solution: def __

Offer試題7(Java版)實現佇列佇列實現

題目:用兩個棧實現一個佇列。佇列的宣告如下,請實現它的兩個函式appendTail和deletedHead,分別完成在佇列尾部插入節點和在佇列頭部刪除節點的功能。 我們通過一個具體的例子來分析該佇列插入和刪除元素的過程。首先插入一個元素a,不妨先把它插入到stack1,此時

offer試題求二叉樹的映象(遞迴、迴圈解法及測試例)

題目:給定二叉樹,將其變換為源二叉樹的映象。 二叉樹的定義如下: struct TreeNode {     int val;     TreeNode* left;     TreeNode* right; }; 輸入描述: 二叉樹的映象定義:     源二叉樹    

offer試題9:實現佇列【C++版本】

題目: 用兩個棧實現佇列 用兩個棧實現一個佇列。佇列的宣告如下,請實現它的兩個成員函式,分別完成在佇列尾部插入節點和在佇列的頭部刪除節點 class solution { public: void push(int node);

offer 試題重建二叉樹

題目:輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹並返回。 思路:二叉樹先序是根左右,中序 是左根右。所以先找到

offer 試題從尾到頭列印連結串列

題目:輸入一個連結串列,按連結串列值從尾到頭的順序返回一個ArrayList。 思路:有多種放法。(1)先反轉連結串列,再列印連結串列。(2)使用棧。 /** * struct ListNode { * int val; * struct ListNode *n

Offer:試題7——實現佇列(java實現

題目描述:用兩個棧來實現一個佇列,完成佇列的Push和Pop操作。 佇列中的元素為int型別。 首先定義兩個棧 Stack<Integer> stack1 = new Stack<Integer>();//作為進隊的埠 Stack

Offer試題17.樹的子結構

一、題目:樹的子結構 題目:輸入兩棵二叉樹A和B,判斷B是不是A的子結構。例如下圖中的兩棵二叉樹,由於A中有一部分子樹的結構和B是一樣的,因此B是A的子結構。   該二叉樹的節點定義如下,這裡使用C#語言描述: public class BinaryTreeNode {

Offer試題31.連結串列的第一公共節點

一、題目:兩個連結串列的第一個公共節點 題目:輸入兩個連結串列,找出它們的第一個公共結點。   連結串列結點定義如下,這裡使用C#語言描述: public class Node { public int key; public Node

Offer試題2.二維陣列中的查詢

一、題目:二維陣列中的查詢 題目:在一個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。     例如下面的二維陣列就是每行、每列都遞增排序。如果在這個陣列中查詢數字7,則返回true;