兩個(gè)棧實(shí)現(xiàn)隊(duì)列
思路:
- stack1 用于存放 push 的元素
- pop 的時(shí)候分兩種情況
- stack2 為空, 把stack1 的棧頂元素彈出, 然后壓入 stack2, 最后調(diào)用 stack2.pop 方法彈出
- stack2 不為空, 直接調(diào)用 stack2.pop 方法彈出
Stack *stack1 = Stack new();
Stack *stack2 = Stack new();
// 入隊(duì)列
void add(data) {
stack1.push(data);
}
// 出隊(duì)列
void poll() {
if (stack1.empty() && stack2.empty()) return ;
// 隊(duì)列2 有元素直接彈出
if (!stack2.empty()) {
stack2.pop();
return;
}
// 把隊(duì)列1的元素都給隊(duì)列2
while(!s1.empty()) {
data = s1.top();
stack2.push(data);
stack1.pop();
}
// 模擬出隊(duì)列操作
stack2.pop();
}
}
兩個(gè)隊(duì)列實(shí)現(xiàn)棧
思路:
- 如果兩個(gè)隊(duì)列為空, 則 push 操作在任意一個(gè)queue中執(zhí)行都行
- 如果有隊(duì)列不為空, 則 push 操作在隊(duì)列不為空的隊(duì)列中執(zhí)行
- pop 操作, 把有數(shù)據(jù)的隊(duì)列除隊(duì)尾的元素, 全部出隊(duì)列壓入另外一個(gè)不為空的隊(duì)列中, 最后 pop 隊(duì)尾元素
兩個(gè)隊(duì)列在操作過(guò)程中總保持其中一個(gè)隊(duì)列為空
Queue *queue1 = Queue new();
Queue *queue2 = Queue new();
// 入棧
void push(data) {
// 判斷兩個(gè)隊(duì)列是否同時(shí)為空
if (queue1.empty() && queue2.empty) {
queue1.add(data);
return;
}
if (queue1.size() > 0) {
queue1.add(data);
} else {
queue2.add(data);
}
// 出棧
void pop() {
if (queue1.empty() && queue2.empty()) return;
if (!queue1.empty()) {
while(queue1.size() > 0) {
result = queue1.poll();
if(queue1.size() != 0) {
queue2.add(result);
}
}
} else {
while(queue2.size() > 0) {
result = queue2.poll();
if (queue2.size() != 0) {
queue1.add(result);
}
}
}
}