两个队列实现一个栈

原理:

如果组成的栈中没元素,那么两个队列为空

如果组成的栈有元素,就要时刻保证一个队列中有元素,另一个队列中没有元素

栈的初始化:初始化两个队列即可

栈的销毁:销毁两个队列即可

入栈:有元素的队列入队列即可


出栈:加入有元素的队列中有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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值