關於佇列和棧的幾道面試題

2021-07-22 20:05:34 字數 4180 閱讀 6230

1 . 實現乙個棧,要求實現push(入棧)、pop(出棧)、min(返回最小值的操作)的時間複雜度為o (1 )

第一道題,我們需要分析,我想一般的思維肯定是想到,開闢一塊空間,進行儲存最小值,這種方法也是大家通常地一下就可以想到的。但是在這裡會有乙個問題,就是如果你的最小值在棧頂,當你pop了棧頂以後,下面的資料中最小的元素就會發生改變,這個時候你無法得到新的最小的元素了。

所以,我們給出一種解決思路:就是你需要有兩個棧,乙個儲存資料,乙個輔助作為儲存最小值情況的棧。,然後當我們進行push的時候,如果輔助最小值的棧也是空的,那麼就push,不是空的時候和最小值棧的棧頂進行比較,如果比它小,再進行壓棧,否則,就不用push。在pop的時候,這個時候我們需要和棧頂比較,如果pop的數值和棧頂是一樣大的話,那麼久吧儲存資料的棧和最小值的棧的棧頂都進行pop。

2 . 使用兩個棧實現乙個佇列對於這個問題的分析,我們可以轉換為兩個棧之間的來回迴圈倒的乙個問題。

在這,我們應該清楚,兩個資料結構的資料特性,乙個是先進後出,乙個是後進先出,所以,我們在這裡可以這樣分析:

當我們入隊操作的時候,對第乙個棧進行壓棧,如果我們想要pop的時候,這個時候其實是要pop的是第乙個棧的棧底元素,所以這個時候我們把第乙個棧棧頂元素push進入第二個棧,然後pop,這樣依次到第乙個棧空。然後我們再pop第二個棧頂元素的top,這樣就是實現了出隊。

}3 . 使用兩個佇列實現乙個棧這道題是利用兩個佇列實現乙個棧,和上面的那道題的方法是類似的,依然是通過調轉實現資料特性就好了。讓資料在兩個佇列當中進行流動,首先我們要確保資料必須只在乙個棧中,push的時候對有元素的棧進行push。然後當我們pop的時候我們把乙個佇列中除了隊尾的元素都push進第二個佇列,最後把隊尾的元素pop出去就好了,這樣就可以實現乙個棧。

}4 . 元素出棧、入棧順序的合法性。如入棧的序列(1 , 2 , 3 , 4 , 5 ),出棧序列為(4 , 5 , 3 , 2 , 1 )這道題的思路也很簡單,就是你所給定的兩個序列陣列,乙個入棧序列,乙個出棧序列。入棧序列比如說是(1,2,3,4,5);出棧序列比如說是(4,5,3,2,1);我們就首先入棧序列第乙個元素入棧,這個時候讓乙個指標指向出棧序列第乙個元素,如果出入棧以後,棧頂元素和指標所指的元素相等,那麼就讓棧頂元素出棧,讓指標++,最後判定棧是否為空就好了,如果為空,就說明是合法的,如果不為空,就不合法。

//判斷元素出棧、入棧順序的合法性。

//如:入棧的序列(1,2,3,4,5)

//出棧序列為(4,5,3,2,1),是合法序列

//入棧序列(1,2,3,4,5),

//出棧序列為(1,5,3,2,4)是不合法序列

#pragma once

#include

#include

#include

#include

using

namespace

std;

int j = 0;

bool judgestackseq(int *inarr, int *outarr, size_t sz)

}return s.empty();

}

5 . 乙個陣列實現兩個棧最後是乙個陣列實現兩個棧這個問題,這個問題我們可以採用三種思路來實現:

上面兩種都會存在空間利用率較低的問題,比如有乙個棧資料很多,乙個棧資料非常小,這個時候第三種方案是最好一些的。

#pragma once 

#include

#include

#include

using namespace std;

template

t>

class

stack

~stack

()

}void push1(const

t& d)

void pop1()

bool empty1()

void push2(const

t& d)

void pop2()

bool empty2()

size_t size1()

size_t size2()

t& top1()

t& top2()

void checkcapacity

()

size_t j(0);

for (j = newcapacity - 1; j

newcapacity - _sz2; --j)

_sz2 = newcapacity - (_capacity - _sz2);

_capacity = newcapacity;

_array = tmp;}}

protected:

t* _array;

size_t _sz1;

size_t _sz2;

size_t _capacity;

};

關於棧和佇列的面試題

1.實現乙個棧,要求實現push,pop min 返回最小值 的時間複雜度為o 1 方法一 解題思路 首先我們在之前封裝的棧結構外面再封裝一層,將其封裝為乙個最小棧,與之前不同的是,我們在棧中存放的是乙個結構體,這個結構體中有兩個成員,乙個是資料本身的值,另乙個為棧內所有存放元素中的最小值,這樣即可...

STL 關於棧和佇列的面試題

題目分別為 1.實現乙個棧,要求實現push 出棧 pop 入棧 min 返回最小值的操作 的時間複雜度為o 1 2.使用兩個棧實現乙個佇列。3.使用兩個佇列實現乙個棧。4.判斷元素出棧 入棧順序的合法性。如 入棧的序列 1,2,3,4,5 出棧序列為 4,5,3,2,1 是合法序列,入棧的序列 1...

棧和佇列面試題

遞迴反轉乙個棧 void reverse stack s reverse s int tmp2 s.top s.pop reverse s s.push tmp1 reverse s s.push tmp2 遞迴排序乙個棧 void sort stack s sort s int tmp2 s.to...