原理:
如果组成的栈中没元素,那么两个队列为空
如果组成的栈有元素,就要时刻保证一个队列中有元素,另一个队列中没有元素
栈的初始化:初始化两个队列即可
栈的销毁:销毁两个队列即可
入栈:有元素的队列入队列即可

出栈:加入有元素的队列中有n个元素,把钱n-1个元素直接出队列,然后直接人另一个队列,把剩下的最后一个元素出队列即可
取栈顶元素:加入有元素的队列中有n个元素,把钱n-1个元素直接出队列,然后直接人另一个队列,把剩下的最后一个元素出队列保存,然后再入另一个队列

头文件Stack.h
#pragma once
#include"SeqQueue.h"
typedef struct Stack{
SeqQueue queue1;
SeqQueue queue2;
}Stack;
void StackInit(Stack* queue); //栈的初始化
void StackDestroy(Stack* queue); //栈的销毁
void StackPush(Stack* queue, QueueType value); //入栈
void SatckPop(Stack* queue); //出栈
int StackTop(Stack* queue, QueueType* value); //取栈顶元素
头文件的实现Stack.c
#include"Stack.h"
#include<stdio.h>
void StackInit(Stack* stack) {
if(stack == NULL) {
return;
}
SeqQueueInit(&stack->queue1);
SeqQueueInit(&stack->queue2);
return;
}
void StackDestroy(Stack* stack) {
if(stack == NULL) {
return;
}
DestroyQueue(&stack->queue1);
DestroyQueue(&stack->queue2);
return;
}
void StackPush(Stack* stack, QueueType value) {
if(stack == NULL) {
return;
}
SeqQueue* queue_p = NULL;
//queue_p指向一个不为空的队列,如果都为空栈,queue_p指向stack->queue2
if(stack->queue1.size != 0) {
queue_p = &stack->queue1;
}
else {
queue_p = &stack->queue2;
}
SeqQueueIn(queue_p, value);
return;
}
void StackPop(Stack* stack) {
if(stack == NULL) {
return;
}
SeqQueue* empty_queue_p;//指向一个空队列
SeqQueue* non_empty_queue_p;//指向一个非空队列
if(stack->queue1.size == 0) {
empty_queue_p = &stack->queue1;
non_empty_queue_p = &stack->queue2;
}
else if(stack->queue2.size == 0) {
empty_queue_p = &stack->queue2;
non_empty_queue_p = &stack->queue1;
}
else {
return ;
}
QueueType box;//用于保存非空队列的队首元素,并保存到空队列内
while(non_empty_queue_p->size > 1) {
SeqQueueFront(non_empty_queue_p, &box);
SeqQueueOut(non_empty_queue_p);
SeqQueueIn(empty_queue_p, box);
}
SeqQueueOut(non_empty_queue_p);
return;
}
int StackTop(Stack* stack, QueueType* value) {
if(stack == NULL) {
return 0;
}
SeqQueue* empty_queue_p;//指向一个空队列
SeqQueue* non_empty_queue_p;//指向一个非空队列
if(stack->queue1.size == 0) {
empty_queue_p = &stack->queue1;
non_empty_queue_p = &stack->queue2;
}
else if(stack->queue2.size == 0) {
empty_queue_p = &stack->queue2;
non_empty_queue_p = &stack->queue1;
}
else {
return 0;
}
if(non_empty_queue_p->size == 0) {
return 0;
}
while(non_empty_queue_p->size > 0) {
SeqQueueFront(non_empty_queue_p, value);
SeqQueueOut(non_empty_queue_p);
SeqQueueIn(empty_queue_p, *value);
}
return 1;
}
/////////////////////////////////////////////////////////////////
// 以下为测试代码
/////////////////////////////////////////////////////////////////
void TestStack() {
Stack stack;
StackInit(&stack);
StackPush(&stack, 'a');
StackPush(&stack, 'b');
StackPush(&stack, 'c');
StackPush(&stack, 'd');
int ret;
QueueType top_value;
ret = StackTop(&stack, &top_value);
printf("ret expect 1, actual %d\n", ret);
printf("top_value expect d, actual %c\n", top_value);
StackPop(&stack);
ret = StackTop(&stack, &top_value);
printf("ret expect 1, actual %d\n", ret);
printf("top_value expect c, actual %c\n", top_value);
StackPop(&stack);
ret = StackTop(&stack, &top_value);
printf("ret expect 1, actual %d\n", ret);
printf("top_value expect b, actual %c\n", top_value);
StackPop(&stack);
ret = StackTop(&stack, &top_value);
printf("ret expect 1, actual %d\n", ret);
printf("top_value expect a, actual %c\n", top_value);
StackPop(&stack);
ret = StackTop(&stack, &top_value);
printf("ret expect 0, actual %d\n", ret);
StackPop(&stack);//尝试对空栈进行出栈
StackDestroy(&stack);
}
int main()
{
TestStack();
return 0;
}
实验结果:

在上面程序中使用以前写过的队列SeqQueue.h和SeqQueue.c

博客介绍了用两个队列实现栈的原理,栈初始化和销毁需对两个队列操作,入栈是有元素的队列入队,出栈和取栈顶元素需将有元素队列的前n - 1个元素移到另一队列。还提及了头文件及使用之前写过的队列程序。
1053

被折叠的 条评论
为什么被折叠?



