棧
棧,是先進後出的線性表,标準STL的棧包括如下5種操作,設棧S:
1.取出棧頂元素:S.top();
2.判斷棧是否為空:S.empty();
3.将元素x添加至棧:S.push(x)
4.彈出棧頂:S.pop();
5.求棧存儲元素的個數:S.size()
#include <stdio.h>
#include <stack>
int main(){
std:: stack<int> S;
if(S.empty()){
printf("S is empty!");
}
S.push(5);
S.push(6);
S.push(10);
printf("S.top = %d\n",S.top());
S.pop();
S.pop();
printf("S.top = %d\n",S.top());
printf("S.size = %d\n",S.size());
return 0;
}
複制
隊列
隊列,是先進先出的線性表,标準STL的隊列包括如下6種操作,設隊列Q:
1.判斷隊列是否為空:Q.empty();
2.傳回隊列頭部元素:Q.front();
3.傳回隊列尾部元素:Q.back()
4.彈出隊列頭部元素:Q.pop();
5.将元素x添加至隊列:Q.push(x);
6.求隊列存儲元素的個數:Q.size()
# include <stdio.h>
# include <queue>
int main(){
std::queue<int> Q;
if(Q.empty()){
printf("Q is empty!\n");
}
Q.push(5);
Q.push(6);
Q.push(10);
printf("Q.front = %d \n",Q.front());
Q.pop();
Q.pop();
printf("Q.front = %d \n",Q.front());
Q.push(1);
printf("Q.back = %d \n",Q.back());
printf("Q.size = %d\n",Q.size());
return 0;
}
複制
1.使用隊列實作棧
LeetCode 225. Implement Stack using Queues
設計一個棧,支援如下操作,棧的内部存儲資料的結構為隊列,隊列的方法隻 能包括push、peek(front)、pop、size、empty等标準的隊列方法。
class MyStack{
public:
MyStack(){
}
void push(int x){
}
int pop(){
}
int top(){
}
bool empty(){
}
};
複制
算法設計,push時調整
普通隊列實作棧stack,内部存儲結構時隊列Queue:
#include<queue>
class Mystack{
public:
Mystack(){}
void push(int x){
std::queue<int> temp_queue;
temp_queue.push(x);//先将新元素push進入temp_queue
while(!_data.empty()){
temp_queue.push(_data.front());//将資料隊列元素導入臨時隊列
_data.pop();
}
while(!temp_queue.empty()){
_data.push(temp_queue.front());//将臨時隊列元素再導入資料隊列
temp_queue.pop();
}
}
int pop(){
int x= _data.front();
_data.pop();
return x;
}
int top(){
return _data.front();
}
bool empty(){
return _data.empty();
}
private:
std::queue<int> _data;
};
複制
使用棧實作隊列
LeetCode 232. Implement Queue using Stacks
設計一個隊列,隊列支援如下操作,盡量使隊列的各項操作的平均時間複雜度是 常數級O(1);隊列的内部存儲資料的結構為棧,棧的方法隻能包括push、top、
pop、size、empty等标準的棧方法。
1.push(x) : 将元素x壓入隊列中
2.pop() : 彈出(移除)隊列頭部元素
3.peek() : 傳回隊列頭部元素(即為front)
4.empty() : 判斷隊列是否是空
算法設計1,push時調整
1.在隊列push元素時,利用臨時棧調換元素次序
2.将原資料棧内容push進入臨時棧temp_stack
3.将新資料push進入臨時棧temp_stack
4.将臨時棧temp_stack中的元素push進入資料棧data_stack
#include <stack>
class MyQueue{
public:
MyQueue(){
}
void push(int x){
std::stack<int> temp_stack
while(! _data.empty){
temp_stack.push(_data.top());
_data.pop();
}
temp_stack.push(x);
while(!temp_stack.empty()){
_data.push(temp_stack.top());
temp.pop()
}
}
int pop(){
int x = _data.top();
_data.pop;
return x;
}
int peek(){
return _data.top();
}
bool empty(){
return _data.empty();
}
};
複制
算法設計2,雙棧法
雙棧法,即用兩個棧,來實作隊列的功能。一個棧為輸入棧input_stack,一個棧為輸出棧output_stack。 算法過程,整體各項操作的平均算法複雜度常數級,O(1):
1.push(x)操作:将待壓入的元素x直接push至input_stack中。
2.pop或peek(front)操作,在擷取隊列頭部元素時,可能需要對兩個棧進行調整(adjust): 如果output_stack不空,不需要調整,直接傳回或彈出output_stack棧頂元素。 否則,将input_stack全部元素push進入output_stack,每push一個元素input_stack彈出一個元素;然後再傳回或彈 出output_stack棧頂元素。
3.empty操作:input_stack與output_stack均為空時,傳回true,否則傳回false。
#include <stack>
class MyQueue{
public:
MyQueue(){
}
void push(int x){
_input.push(x);//直接将x push進入_input
}
int pop(){
adjust();//調整再進行pop
int x = _output.top();
_output.pop();
return x;
}
int peek(){
adjust();
return _output.top();
}
bool empty(){//當input_stack與output_stack 同時為空時,才傳回true
return _input.empty()&&_output.empty();
}
private:
void adjust(){
if(!_output.empty()){
return ;
}
while(!_input.empty()){
_output.push(_input.top());
_input.pop();
}
}
std::stack<int> _input;
std::stack<int> _output;
};
複制