棧和佇列的相關面試題(詳解)

2021-08-18 11:36:02 字數 3821 閱讀 3411

#include#include#includeusing namespace std;

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

//方法一:用兩個棧實現,先同時往s1,和min裡面入第乙個元素,接著s1正常入,同時_min入的時候用s1棧頂相比,如果小於s1棧頂,則就往_min裡面扔原來棧裡面的,否則扔s1棧頂的

template class minstack

else

}void pop()

t& min()

bool empty()

else

}protected:

stack _s1;

stack _min;

};int main()

//方法二 上面的方法最小棧_min裡面的資料太多 ,優化。最小棧_min裡面只存小於棧頂元素,或等於棧頂元素的值,出棧時最小棧_min只出和_s棧頂相同的元素

template class minstack

} void pop() }

t& min()

bool empty()

else

}private:

stack_s;

stack _min;

};int main()

//方法三 引用計數(最終方法,也是最好的方法) 因為上面的方法如果連續重複的資料很多,_min棧裡也就會有重複的資料,想想如果棧裡儲存的是結構體,也就浪費空間了

template class minstack

}; typedef struct valref valref;

public:

void push(const t& x)

else if ((_min.top())._value == x)

}void pop()

_s1.pop();

} else

}t& min()

private:

stack_s1;

stack_min;

};int main()

//問題二  用兩個棧實現乙個佇列

//大體思路:兩個棧叫做_push,_pop,入的時候往_push這個棧裡面入,出的時候往從_pop這個棧裡面出,如果這個棧裡面沒資料了,就把_push裡面的資料往_pop裡面出.等到兩個棧裡面都沒有資料就結束了

templateclass queuebytwostack

void pop()

}_pops.pop();

}t& front()

}return _pops.top();

} bool empty()

size_t size()

private:

stack_pushs;

stack_pops;

};int main()

system("pause");

return 0;

}

//問題三 用兩個佇列實現乙個棧

templateclass stackbytwoqueue

else

}void pop()

while (pnonemptyq->size() > 1)

pnonemptyq->pop();

} t& top()

else

} bool empty()

else

}size_t size()

else

}private:

queueq1;

queueq2;

};void test() }

int main()

//4.乙個陣列實現兩個棧

#includetemplateclass twostack

void checkcapacity()

int j = newcapacity - 1;

for (int i =_capacity-1 ; i>=_size2 ; i--)

_size2 =_size2+newcapacity-_capacity;

_capacity = newcapacity;

delete _a;

_a= tmp;

} }~twostack()

_a = null;

_size1 = 0;

_size2 = 0;

_capacity = 0;

} void push1(const t& x)//向棧1中插入

void push2(const t& x)//向棧2中插入

void pop1()//刪除棧1頂元素

void pop2()//刪除棧2頂元素

size_t size1()//取棧1中元素個數

size_t size2()//取棧2中元素個數

t& top1()

t& top2()

bool empty1()

bool empty2()

private:

t* _a;//陣列

int _size1;//棧1的棧頂在陣列中的下標

int _size2;//棧2的棧頂在陣列中的下標

int _capacity;

};int main()

cout << endl;

twostacks2;

s2.push2(1);

s2.push2(2);

s2.push2(3);

s2.push2(4);

cout << s2.size2() << endl;

while (!s2.empty2())

system("pause");

return 0;

}

//5.元素出棧,入棧順序的合法性  如:入棧的序列(1,2,3,4,5),出棧序列為(4,5,3,2,1)則合法,入棧的序列(1,2,3,4,5),出棧序列為(4,5,2,3,1)則不合法

//具體的思路:如果出棧序列中棧頂元素剛好與當前入棧的元素相等,則直接pop出來,如果不相等則一直將入棧序列的元素往當前棧中放,直到遇見與出棧序列棧頂

//相等的,然後一起pop。如果已經將入棧序列中的元素入完了,還是沒有遇見與出棧序列棧頂的元素相同,則說明出棧序列不和法

#include#include#include#include#includeusing namespace std;

bool ispoporder(int* instack, int* outstack, int length)

stacks;

s.push(instack[0]);

int incount = 1;

int outcount = 0;

while (outcountif (s.top() == outstack[outcount])

else

}return true;

}int main()

; int outstack[5] = ;*/

int instack[5] = ;

int outstack[5] = ;

cout << ispoporder(instack, outstack, 5) << endl;

system("pause");

return 0;

}

棧和佇列面試題

遞迴反轉乙個棧 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...

棧和佇列面試題

1.使用兩個棧,實現乙個佇列。棧 先進後出,且只能從棧頂pop出資料。佇列 先進先出,對頭pop資料,隊尾push資料。如下 include template class myqueue void pop else if stack2.empty private stack stack1 stack...

棧和佇列面試題

採用順序棧實現棧基本操作 採用鏈式佇列實現佇列基本操作 define maxsize100 typedef int sdatatype typedef struct stack stack typedef struct minstack minstack void stackinit stack s...