问题
两个栈实一个队列
虽然这种问题在实际开发中压根不会出现,但是解决这个问题可以使我们对栈和队列的理解更上一层楼
思路
定义一个栈为 input,另一个为 output
入队列时,要将 output 中所有元素出栈到 input 中,然后再入栈 input
出队列时,要将 input 中所有元素出栈到 output 中,然后再出栈 output
方法实现
seqstack.h以及它的 .c 实现移步
queueby2stack.h
#pragma once
// 上方有链接
#include "seqstack.h"
typedef struct QueueBy2 {
SeqStack input;
SeqStack output;
} QueueBy2;
// 出栈
void QueueBy2Pop(QueueBy2* queue);
// 入栈
void QueueBy2Push(QueueBy2* queue, Datatype value);
// 取栈顶元素
int QueueBy2Top(QueueBy2* queue, Datatype* value);
queueby2stack.c
#include "queueby2stack.h"
// 出栈
void QueueBy2Pop(QueueBy2* queue) {
// 非法输入
if(queue == NULL) {
perror("Pop");
return;
}
Datatype value;
// 取 input 栈顶元素
int ret = SeqStackTop(&queue->input, &value);
// input 空栈,直接进行 output 出栈
if(ret == 0) {
ret = SeqStackTop(&queue->output, &value);
if(ret != 0) {
SeqStackPop(&queue->output);
}
return;
} else { // input 不为空栈,全部出栈到 output
while(ret != 0) {
// 将 input 出栈元素入栈到 output 中
SeqStackPop(&queue->input);
SeqStackPush(&queue->output, value);
ret = SeqStackTop(&queue->input, &value);
}
SeqStackPop(&queue->output);
return;
}
}
// 入栈
void QueueBy2Push(QueueBy2* queue, Datatype value) {
// 非法输入
if(queue == NULL) {
perror("Pop");
return;
}
Datatype data;
// 取 output 栈顶元素
int ret = SeqStackTop(&queue->output, &data);
// output 空栈,直接进行 input 入栈
if(ret == 0) {
SeqStackPush(&queue->input, value);
return;
} else { // output 不为空栈,全部出栈到 input
while(ret != 0) {
// 将 output 出栈元素入栈到 input 中
SeqStackPop(&queue->output);
SeqStackPush(&queue->input, data);
ret = SeqStackTop(&queue->output, &data);
}
SeqStackPush(&queue->input, value);
return;
}
}
// 取栈顶元素
int QueueBy2Top(QueueBy2* queue, Datatype* value) {
// 非法输入
if(queue==NULL || value==NULL) {
perror("Pop");
return 0;
}
Datatype data;
// 取 input 栈顶元素
int ret = SeqStackTop(&queue->input, &data);
// input 空栈,直接进行 output 出栈
if(ret == 0) {
ret = SeqStackTop(&queue->output, value);
return ret;
} else { // input 不为空栈,全部出栈到 output
while(ret != 0) {
// 将 input 出栈元素入栈到 output 中
SeqStackPop(&queue->input);
SeqStackPush(&queue->output, data);
ret = SeqStackTop(&queue->input, &data);
}
int ret = SeqStackTop(&queue->output, value);
return ret;
}
}
#if 1
/* ***************************************************
* ******************* tes *************************
* ***************************************************/
#include <stdio.h>
#define FUNCTION() printf("=================== %s ==================\n", __FUNCTION__)
void print(QueueBy2 queue, const char* msg) {
printf("%s\n", msg);
int i = 0;
// input 空栈
if(queue.input.size == 0) {
printf("input 空队列\n");
}
else {
printf("input队尾\n");
for(i = queue.input.size-1; i >= 0; i--) {
printf("%c\n", queue.input.data[i]);
}
}
// output 空栈
if(queue.output.size == 0) {
printf("output 空队列\n");
}
else {
printf("output队首\n");
for(i = queue.output.size-1; i >= 0; i--) {
printf("%c\n", queue.output.data[i]);
}
}
return;
}
// 入栈测试
void TestPush() {
FUNCTION();
QueueBy2 queue;
SeqStackInit(&queue.input);
SeqStackInit(&queue.output);
QueueBy2Push(&queue, 'a');
QueueBy2Push(&queue, 'b');
QueueBy2Push(&queue, 'c');
QueueBy2Push(&queue, 'd');
print(queue, "入队列四个");
}
// 出栈测试
void TestPop() {
FUNCTION();
QueueBy2 queue;
SeqStackInit(&queue.input);
SeqStackInit(&queue.output);
QueueBy2Push(&queue, 'a');
QueueBy2Push(&queue, 'b');
QueueBy2Push(&queue, 'c');
QueueBy2Push(&queue, 'd');
print(queue, "入队列四个");
QueueBy2Pop(&queue);
print(queue, "出队列一个");
}
// 获取队首元素
void TestTop() {
FUNCTION();
QueueBy2 queue;
SeqStackInit(&queue.input);
SeqStackInit(&queue.output);
QueueBy2Push(&queue, 'a');
QueueBy2Push(&queue, 'b');
QueueBy2Push(&queue, 'c');
QueueBy2Push(&queue, 'd');
print(queue, "入队列四个");
Datatype value;
int ret = QueueBy2Top(&queue, &value);
printf("ret is %d, top is %c\n", ret, value);
}
int main() {
TestPush();
TestPop();
TestTop();
}
#endif
代码实现平台为CentOS6.5, 如有纰漏,请斧正