两个栈实现一个队列-----队列和栈面试题2

问题

两个栈实一个队列

虽然这种问题在实际开发中压根不会出现,但是解决这个问题可以使我们对栈和队列的理解更上一层楼

思路

定义一个栈为 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, 如有纰漏,请斧正

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值