栈与队列-用栈实现队列

      力扣题号:232. 用栈实现队列

一、题目描述

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(pushpoppeekempty):

实现 MyQueue 类:

  • void push(int x) 将元素 x 推到队列的末尾
  • int pop() 从队列的开头移除并返回元素
  • int peek() 返回队列开头的元素
  • boolean empty() 如果队列为空,返回 true ;否则,返回 false

说明:

  • 你 只能 使用标准的栈操作 —— 也就是只有 push to toppeek/pop from topsize, 和 is empty 操作是合法的。
  • 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。

二、示例

Queue Q;
Queue_init(Q);
Queue_push(Q, 1);
Queue_push(Q, 2);
Queue_push(Q, 3);

cout << Queue_peek(Q) << " ";

Queue_push(Q, 4);
Queue_push(Q, 5);

cout << Queue_pop(Q) << " ";
cout << Queue_pop(Q) << " ";
cout << Queue_pop(Q) << " ";
cout << Queue_pop(Q) << " ";
cout << Queue_pop(Q) << endl;

三、求解思路

四、代码实现

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>  
#include <iostream>
using namespace std;

#define MAX_SIZE 100 // 定义栈的最大容量  

typedef struct {
    int data[MAX_SIZE]; // 存储数据的数组  
    int top; // 栈顶的位置,初始化为-1(空栈)  
} Stack;

// 初始化栈  
void initStack(Stack& s) {
    s.top = -1;
}

// 判断栈是否为空  
bool isEmpty(Stack& s) {
    return s.top == -1;
}

// 判断栈是否已满  
bool isFull(Stack& s) {
    return s.top == MAX_SIZE - 1;
}

// 入栈操作  
bool push(Stack& s, int value) {
    if (isFull(s)) {
        printf("Stack is full\n");
        return false;
    }
    s.data[++s.top] = value; // 先移动栈顶指针,再存储数据  
    return true;
}

// 出栈操作  
bool pop(Stack& s, int& value) {
    if (isEmpty(s)) {
        printf("Stack is empty\n");
        return false;
    }
    value = s.data[s.top--]; // 先取出数据,再移动栈顶指针  
    return true;
}

// 查看栈顶元素  
bool peek(Stack& s, int& value) {
    if (isEmpty(s)) {
        printf("Stack is empty\n");
        return false;
    }
    value = s.data[s.top];
    return true;
}

typedef struct {
    Stack s_in;
    Stack s_out;
}Queue;

// 初始化队列
void Queue_init(Queue& Q) {
    initStack(Q.s_in);
    initStack(Q.s_out);
}

// 将一个元素放入队列的尾部。
bool Queue_push(Queue& Q,int x) {
    return push(Q.s_in, x);
}

// 返回队列首部的元素。
int Queue_peek(Queue& Q) {
    int x;
    if (isEmpty(Q.s_out)) {
        while (!isEmpty(Q.s_in)) {
            peek(Q.s_in, x);
            push(Q.s_out, x);
            pop(Q.s_in,x);
        }
    }
    return peek(Q.s_out, x);
}

// 从队列首部移除元素。
int Queue_pop(Queue& Q) {
    int x;
    Queue_peek(Q);
    pop(Q.s_out, x);

    return x;
}

// 返回队列是否为空。
bool Queue_empty(Queue& Q) {
    return !isEmpty(Q.s_in) && !isEmpty(Q.s_out);
}

int main(){

    Queue Q;
    Queue_init(Q);
    Queue_push(Q, 1);
    Queue_push(Q, 2);
    Queue_push(Q, 3);

    cout << Queue_peek(Q) << " ";

    Queue_push(Q, 4);
    Queue_push(Q, 5);

    cout << Queue_pop(Q) << " ";
    cout << Queue_pop(Q) << " ";
    cout << Queue_pop(Q) << " ";
    cout << Queue_pop(Q) << " ";
    cout << Queue_pop(Q) << endl;
    

    return 0;
}

五、运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值