(力扣)用两个栈实现队列

简介: 这里是栈的源代码:栈和队列的实现当然,自己也可以写一个栈来用,对题目来说不影响,只要符合栈的特点就行。

bdbfafa32e744dd1919b9ad0c9ac39b8.png

这里是栈的源代码:栈和队列的实现


当然,自己也可以写一个栈来用,对题目来说不影响,只要符合栈的特点就行。


题目:

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


实现 MyQueue 类:

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


题解:

做题前需要的栈:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>
typedef int DataType;
typedef struct Stack
{
  DataType* data;
  int top;
  int capacity;
}Stack;
void Init(Stack *st);
void Push(Stack* st, DataType x);
void Pop(Stack* st);
DataType GetTop(Stack* st);
bool Empty(Stack* st);
void Destroy(Stack* st);
int Size(Stack* st);
void Init(Stack* st)
{
  assert(st);
  st->data = NULL;
  st->top = 0;
  st->capacity = 0;
}
void Push(Stack* st, DataType x)
{
  assert(st);
  if (st->capacity == st->top)
  {
    int newcapacity = (st->capacity == 0) ? 4 : st->capacity * 2;
    DataType* temp = (DataType*)realloc(st->data, sizeof(DataType) * newcapacity);
    if (temp == NULL)
    {
      perror("realloc fail");
      exit(-1);
    }
    st->data = temp;
    st->capacity = newcapacity;
  }
  st->data[st->top++] = x;
}
void Pop(Stack* st)
{
  assert(st);
  assert(st->top > 0);
  st->top--;
}
DataType GetTop(Stack* st)
{
  assert(st);
  assert(st->top > 0);
  return st->data[st->top - 1];
}
bool Empty(Stack* st)
{
  assert(st);
  return (st->top == 0);
}
void Destroy(Stack* st)
{
  assert(st);
  free(st->data);
  st->data = NULL;
  st->top = st->capacity = 0;
}
int Size(Stack* st)
{
  assert(st);
  return st->top;
}


题目正题:  


//定义出两个栈
typedef struct 
{
    Stack push;
    Stack pop;
} MyQueue;

//初始化队列
MyQueue* myQueueCreate() 
{
    MyQueue* obj = (MyQueue*)malloc(sizeof(MyQueue));
    Init(&obj->push);
    Init(&obj->pop);
    return obj;
}

//向队列中插入元素
void myQueuePush(MyQueue* obj, int x) 
{
    Push(&obj->push,x);
}

//元素出队列
int myQueuePop(MyQueue* obj) 
{
    int ret = myQueuePeek(obj);
    Pop(&obj->pop);
    return ret;
}

//返回队列开头的元素
int myQueuePeek(MyQueue* obj) 
{
    if(Empty(&obj->pop))
    {
        int size = Size(&obj->push);
        for(int i=0; i<size; i++)
        {
            Push(&obj->pop,GetTop(&obj->push));
            Pop(&obj->push);
        }
    }
    return GetTop(&obj->pop);
}

//判断队列是否为空
bool myQueueEmpty(MyQueue* obj) 
{
    return Empty(&obj->pop) && Empty(&obj->push);
}

//销毁队列
void myQueueFree(MyQueue* obj) 
{
    free((&obj->push)->data);
    free((&obj->pop)->data);
    free(obj);
}


目录
相关文章
|
19天前
LeetCode 热题100——单调栈
LeetCode 热题100——单调栈
21 0
|
19天前
|
Go C++
【力扣】2696. 删除子串后的字符串最小长度(模拟 栈 C++ Go实现栈)
【2月更文挑战第18天】2696. 删除子串后的字符串最小长度(模拟 栈 C++ Go实现栈)
36 6
|
19天前
【Leetcode 2487】从链表中移除节点 —— 单调栈
解题思路:维持一个单调递增栈,当栈为空时,记录当前节点为头节点;否则当前节点为栈顶节点的后继节点
|
19天前
【Leetcode 1944】队列中可以看到的人数 —— 单调栈
解题思路:维持一个单调递增栈来辅助计算每个人能够看到的人数。从右往左遍历数组,对于每个人,我们将其身高与栈顶元素的身高进行比较。如果当前人的身高比栈顶元素的身高高,则栈顶元素无法被当前人看到,将其出栈,并累计计数
LeetCode | 232. 用栈实现队列
LeetCode | 232. 用栈实现队列
|
7天前
|
索引
【力扣刷题】数组实现栈、后缀表达式(逆波兰表达式)求值、中缀表达式转换为后缀表达式(无括号&&有括号)
【力扣刷题】数组实现栈、后缀表达式(逆波兰表达式)求值、中缀表达式转换为后缀表达式(无括号&&有括号)
13 0
|
14天前
|
机器学习/深度学习 存储 算法
数据结构与算法⑨(第三章_下)队列的概念和实现(力扣:225+232+622)(下)
数据结构与算法⑨(第三章_下)队列的概念和实现(力扣:225+232+622)
5 0
|
14天前
|
算法 前端开发 C语言
数据结构与算法⑨(第三章_下)队列的概念和实现(力扣:225+232+622)(上)
数据结构与算法⑨(第三章_下)队列的概念和实现(力扣:225+232+622)
12 0
|
14天前
|
缓存 算法 C语言
数据结构与算法⑧(第三章_上)栈的概念和实现(力扣:20. 有效的括号)
数据结构与算法⑧(第三章_上)栈的概念和实现(力扣:20. 有效的括号)
6 0
|
19天前
|
存储 算法
【LeetCode力扣】单调栈解决Next Greater Number(下一个更大值)问题
【LeetCode力扣】单调栈解决Next Greater Number(下一个更大值)问题
9 0