【LeetCode每日一题】——面试题03.04.化栈为队

文章目录

  • 一【题目类别】
  • 二【题目难度】
  • 三【题目编号】
  • 四【题目描述】
  • 五【题目示例】
  • 六【解题思路】
  • 七【题目说明】
  • 八【时间频度】
  • 九【代码实现】
  • 十【提交结果】

一【题目类别】

  • 队列

二【题目难度】

  • 简单

三【题目编号】

  • 面试题03.04.化栈为队

四【题目描述】

  • 实现一个MyQueue类,该类用两个栈来实现一个队列。

五【题目示例】

  • 示例:
MyQueue queue = new MyQueue();

queue.push(1);
queue.push(2);
queue.peek();  // 返回 1
queue.pop();   // 返回 1
queue.empty(); // 返回 false

六【解题思路】

  • 很经典的一道题目,利用双栈去完成操作
  • 因为栈是后进先出,而队列是先进先出,所以每次入队列的时候,将主栈中的元素都放到辅助栈,再将元素入主栈,最后再将辅助栈的元素入主栈。看起来很复杂,其实很好理解,脑子里想一下或者可以用笔和纸简单画一画就明白了
  • 至于出队列、peek队列、队列判空等方法,直接根据主栈判断即可。辅助栈只在入队列的时候有帮助,其余函数并没用到

七【题目说明】

  • 你只能使用标准的栈操作 – 也就是只有 push to top, peek/pop from top, size 和 is empty 操作是合法的。
  • 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。
  • 假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作)。

八【时间频度】

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 为元素个数
  • 空间复杂度: O ( n ) O(n) O(n),其中 n n n 为元素个数

九【代码实现】

  1. Java语言版
package Queue;

import java.util.Stack;

public class I0304_ImplementQueueUsingStacksIcci {

    Stack<Integer> stack;
    Stack<Integer> temp;

    public void MyQueue() {
        stack = new Stack<>();
        temp = new Stack<>();
    }

    public void push(int x) {
        if (stack.isEmpty()) {
            stack.push(x);
            return;
        }
        while (!stack.isEmpty()) {
            temp.push(stack.pop());
        }
        stack.push(x);
        while (!temp.isEmpty()) {
            stack.push(temp.pop());
        }
    }

    public int pop() {
        return stack.pop();
    }

    public int peek() {
        return stack.peek();
    }

    public boolean empty() {
        return stack.isEmpty();
    }

}
  1. C语言版
#include
#include
#include

typedef struct
{
	int data[1000];
	int top;
} MyQueue;

MyQueue* myQueueCreate()
{
	MyQueue* stack = (MyQueue*)malloc(sizeof(MyQueue));
	stack->top = -1;
	return stack;
}

void myQueuePush(MyQueue* obj, int x)
{
	if (obj->top == -1)
	{
		obj->data[++obj->top] = x;
		return;
	}
	MyQueue* temp = myQueueCreate();
	while (obj->top >= 0)
	{
		temp->data[++temp->top] = obj->data[obj->top--];
	}
	obj->data[++obj->top] = x;
	while (temp->top >= 0)
	{
		obj->data[++obj->top] = temp->data[temp->top--];
	}
}

bool myQueueEmpty(MyQueue* obj)
{
	return obj->top == -1;
}

int myQueuePop(MyQueue* obj)
{
	if (!myQueueEmpty(obj))
	{
		return obj->data[obj->top--];
	}
	return NULL;
}

int myQueuePeek(MyQueue* obj)
{
	if (!myQueueEmpty(obj))
	{
		int res = 0;
		res = obj->data[obj->top];
		return res;
	}
	return NULL;
}

void myQueueFree(MyQueue* obj)
{
	if (obj)
	{
		free(obj);
	}
}

/*主函数省略*/

十【提交结果】

  1. Java语言版
    【LeetCode每日一题】——面试题03.04.化栈为队_第1张图片

  2. C语言版
    【LeetCode每日一题】——面试题03.04.化栈为队_第2张图片

你可能感兴趣的:(LeetCode,leetcode,算法,数据结构,栈,队列)