1. 程式人生 > >資料結構-棧和佇列面試題(下)

資料結構-棧和佇列面試題(下)

面試題四:元素出棧、入棧順序的合法性。如入棧的序列(1,2,3,4,5),出棧序列為(4,5,3,2,1)。

思路:
①首先判斷出棧入棧序列長度是否一致,不一致直接返回false;
②借用一個臨時的棧,依次遍歷入棧序列的每一個元素,每次都先將入棧序列的第i個元素先入臨時棧,這時就需要進行檢查,判斷臨時棧的棧頂元素是否等於出棧序列的第index個元素,相等的話臨時棧進行一次pop,OutputIndex指向下一個出棧序列的下標。當入棧序列遍歷完成後,若臨時棧還存有元素,則返回false;反之為true。
實現程式碼:
bool JudgeLegal(vector
<int>
Input,vector<int> Output) { if (Input.size() != Output.size()) return false; else { stack<int> tmp; int OutputIndex = 0; for (int i = 0; i < Input.size(); i++) { tmp.push(Input[i]); while (tmp.size()>0
&& tmp.top() == Output[OutputIndex]) { tmp.pop(); OutputIndex++; } } return (tmp.size() > 0) ? false : true; } }
測試:

這裡寫圖片描述

面試題五:一個數組實現兩個棧

思路:
方法一:採用交叉索引的方式,陣列奇數位為一個棧,偶數位為一個棧;每次push,pop操作找到對應的下標進行操作;
方法二:可計算出陣列中間位置,左半部分為棧1,右半部分為棧2;
方法三:相對於前兩種比較優的解決方法,棧1從陣列下標為0開始不斷增大,棧2從陣列元素個數-1的下標開始不斷減小。
相比三種方法,效率不相上下,第一二種考慮增容時會比較麻煩,第三種較簡單;第一種和第二種方法在其中一個棧壓入比較多的資料而另外一個棧資料很少時,就存在非常大的空間浪費,但方法三就可以很好的避免這一情況,空間利用率比較高,而且這種方案在一個棧pop的空間另一個棧可以使用,可以在一些情況下減少開闢空間的次數。簡單的圖示下三種區別:

這裡寫圖片描述

方法三的實現程式碼:
class ArrayTwoStack
{
public:
    ArrayTwoStack()
        :_a(new int[2])
        , _capacity(2)
        ,stack1_size(0)
        ,stack2_size(1)
    {}

    void Stack1Push(const int& x)
    {
        CheckCapacity();
        _a[stack1_size++] = x;
    }

    void Stack2Push(const int& x)
    {
        CheckCapacity();
        _a[stack2_size--] = x;
    }

    void Stack1Pop()
    {
        if (stack1_size > 0)
            stack1_size--;
    }

    void Stack2Pop()
    {
        //stack2_size == capacity -1時說明stack2為空
        if (stack2_size < _capacity - 1)
            stack2_size++;  
    }

    const int& Stack1Top()
    {
        if (stack1_size != 0)
            return _a[stack1_size-1];
    }

    const int& Stack2Top()
    {
        if(stack2_size != _capacity-1)
            return _a[stack2_size+1];
    }

    size_t SizeofStack1()
    {
        return stack1_size;
    }

    size_t SizeofStack2()
    {
        return _capacity - 1 - stack2_size;
    }

    void Stack1Print()
    {
        for (int i = 0; i < stack1_size; i++)
        {
            cout << _a[i] << " ";
        }
        cout << endl;
    }

    void Stack2Print()
    {
        for (int i =stack2_size+1; i < _capacity; i++)
        {
            cout << _a[i] << " " ;
        }
        cout << endl;
    }

protected:
    void CheckCapacity()
    {
        if (stack2_size - stack1_size > 0)
            return;
        else
        {
            int newCapacity = _capacity * 2;
            int* tmp = new int[newCapacity];

            //從前向後拷貝stack1
            for (int i = 0; i < stack1_size; i++)
                tmp[i] = _a[i];

            //從後向前拷貝stack2
            int stack2_index = newCapacity - 1;
            for (int i = _capacity - 1; i > stack2_size; i--)
                tmp[stack2_index--] = _a[i];

            _a = tmp;
            _capacity = newCapacity;
            stack2_size = stack2_index;
        }
    }

private:
    int* _a;
    int _capacity;  //容量
    int stack1_size; //stack1的棧頂下標
    int stack2_size;  //stack2的棧頂下標
};
測試:
注意:Print操作是按照下標輸出的,stack2的棧底是最後一個元素,下標依次減小,更詳細的測試可拷貝下來詳細測試。

這裡寫圖片描述

相關推薦

資料結構-佇列試題

面試題四:元素出棧、入棧順序的合法性。如入棧的序列(1,2,3,4,5),出棧序列為(4,5,3,2,1)。 思路: ①首先判斷出棧入棧序列長度是否一致,不一致直接返回false; ②借用一個臨時的棧,依次遍歷入棧序列的每一個元素,每次

資料結構-佇列試題(上

在資料結構的學習過程中,棧和佇列的掌握是十分重要的。所以找了幾個很熱門的面試題試試手並小結一下。先回顧下棧和佇列的特性:棧是後進先出,主要介面有PUSH,POP,TOP,而佇列是先進先出,主要介面有PU

佇列試題---一個數組實現兩個

一,用一個數組實現兩個棧(先進後出),有以下幾種方法: ①陣列的奇數位置儲存一個棧的元素,偶數位置儲存另一個棧的元素; ②兩個棧分別從陣列的中間向兩頭增長; 陣列的中間位置看做兩個棧的棧底,壓棧時棧頂指標分別向兩邊移動,當任何一邊到達陣列的起始位置或是陣

佇列試題

4.元素出棧入棧的合法性,如入棧的序列(1,2,3,4,5),出棧的序列為(4,5,3,2,1). 思想:先入棧一個元素,將出棧序列的第一個元素和該棧的棧頂元素比較,如果相同,那就讓該元素出棧且出棧序

佇列試題---用兩個佇列實現一個

一:queue是一種”先進先出”的資料結構,他在對尾插入元素,在隊頭刪除元素,他既可以取到自己的隊頭元素,也可以取到自己的隊尾元素; stack是一種”先進後出”的資料結構,他對元素的插入和

佇列試題C語言版

1.判斷出入棧的合法性 2.使用兩個棧實現一個佇列 思想:1.棧1中的所有資料彈到棧2中(棧2為空棧)            2.再從棧2彈出所有資料,則可出現佇列的效果 (預設壓資料壓到佇列1中,從佇列2出資料) typedef struct Stack {

資料結構】--幾道佇列試題

用兩個棧實現一個佇列 1、思路分析 拿到這道題,會有以下幾種思路: 思路一: 入隊時,將所有的元素壓入到s1中 出隊時,將s1中的所有元素倒入到s2中,然後讓s2中棧頂的元素出棧,然後將s2中所有的元素倒入到s1中 問題所在:我們不難發現,在這種解法

資料結構--佇列試題

實現一個棧,要求實現Push(出棧)、Pop(入棧)、Min(返回最小值)的時間 複雜度為O(1) 方法1、棧Push時:當棧為空時,push兩次第一個資料。棧頂的數來儲存當前狀態的最小值。 再次Push資料時候,先拿將要Push的資料與棧頂的最小值進行比較,更

資料結構---佇列結構體實現

棧(LIFO) 棧(stack)是一種只能在一端進行插入或刪除操作的線性表。 棧頂(top):允許進行插入、刪除操作的一端 棧底(bottom):另一端稱為棧底 進棧或入棧(push):插入操作 出棧或退棧(pop):棧的刪除操作 n個不同元素通過一個棧產生的出棧

資料結構---佇列例題、練習及解答

棧的應用 Q1:簡單表示式求值 限定的簡單表示式求值問題是使用者輸入一個包含+、-、*、/、正整數和圓括號的合法算術表示式,計算該表示式的結果。 思路:(1)將算術表示式轉換成字尾表示式 (2)字尾表示式求值 具體執行程式碼: #include <

資料結構佇列的順序儲存結構鏈式儲存結構的實現

一、 實驗目的1. 熟悉棧的特點(先進後出)及棧的抽象類定義;2. 掌握棧的順序儲存結構和鏈式儲存結構的實現;3. 熟悉佇列的特點(先進先出)及佇列的抽象類定義;4. 掌握棧的順序儲存結構和鏈式儲存結構的實現;二、實驗要求1. 複習課本中有關棧和佇列的知識;2. 用C++語言

解析佇列試題

一、實現一個棧,要求實現Push(入棧)、Pop(出棧)、Min(返回最小值)的時間複雜度為O(1) 思路: 1、首先定義兩個棧(s,min),棧s存放資料,棧min存放當前所有資料的最小值 2、對於棧s正常入棧,出棧就可以 3、對於棧min,當棧min為空或者入棧的資料x小於等於

資料結構 - 佇列

資料結構 - 棧和佇列 介紹 棧和佇列是兩種很簡單, 但也很重要的資料結構, 在之後的內容也會用到的

佇列試題

採用順序棧實現棧基本操作; 採用鏈式佇列實現佇列基本操作; #define MAXSIZE100; typedef int SDataType; typedef struct Stack { SDataType array[MAXSIZE]; int t

資料結構——佇列

棧和佇列 一、選擇題 ~~01|03|1|1 ^^設有一個遞迴演算法如下 int fact(int n) { //n大於等於0 if(n<=0) return 1; else return n*fact(n-1); } 則計算fact(n)

資料結構佇列、遞迴演算法

知識要點: 棧的定義、結構特點及其儲存方式(順序儲存與連結儲存)和基本操作的實現演算法; 佇列的結構、特點及其儲存方式(順序儲存與連結儲存)和基本操作的實現演算法。 遞迴的基本概念和實現原理以及用遞迴的思想描述問題和書寫演算法的方法; 用棧實現遞迴問題的非遞迴解法。

資料結構 佇列

文章目錄 1 棧 1.1 抽象資料型別棧的定義 1.1.1 棧頂和棧尾 1.1.2 空棧 1.1.3 特點 1.1.4 上溢和下溢 1.2 棧的表示和實現 1.2.1

還債系列之資料結構——佇列

三、棧 還記得當初第一次學習程式設計的時候還是8051微控制器中的組合語言,現在還記得很清楚,當初遇到的一個簡單的資料結構就是——棧,對應的組合語言中的命令是push和pop。這個結構在生活中是有很多類似的例子的,比如水杯、碗等。該結構的特點如下: 最大特

資料結構 佇列 演算法設計題

五 演算法設計題 1. 設有兩個棧S1,S2都採用順序棧方式,並且共享一個儲存區[O..maxsize-1],為了儘量利用空間,減少溢位的可能,可採用棧頂相向,迎面增長的儲存方式。試設計S1,S2有關入棧和出棧的操作演算法。 【哈爾濱工業大學 2001 七 (12分)】 2

資料結構:佇列-迷宮問題求解

//--------------------檔名:Maze.cpp------------------------//----------------------By SunxySong-------------------------//說明:本程式以迷宮問題進行演示,瞭解