(力扣)用两个队列实现栈---C语言

简介: 注意:这道题目队列的实现方法不同不会影响题目,只要是个队列,先进先出,那么不管你是双向还是结构不同,都不会影响题目的实现。

分享一首歌曲吧,希望在枯燥的刷题生活中带给你希望和勇气,加油!

4f7a7b8419714ee68b77e7a94038a583.png


题目:

请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。


实现 MyStack 类:


   ●  void push(int x) 将元素 x 压入栈顶。

   ●  int pop() 移除并返回栈顶元素。

   ●  int top() 返回栈顶元素。

   ●  boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。


题解:

首先自己实现一个队列粘贴复制过去:


注意:这道题目队列的实现方法不同不会影响题目,只要是个队列,先进先出,那么不管你是双向还是结构不同,都不会影响题目的实现。

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>
typedef int DataType;
typedef struct Queue
{
  DataType data;
  struct Queue *next;
}Queue;
typedef struct Q
{
  Queue* head;
  Queue* tail;
  int size;
}Q;
void Init(Q *qq);
void Destroy(Q* qq);
void QueuePush(Q* qq, DataType x);
void QueuePop(Q* qq);
DataType GetQueueFrontNum(Q* qq);
DataType GetQueueBackNum(Q* qq);
bool Empty(Q* qq);
int Size(Q* qq);
void Init(Q* qq)
{
  assert(qq);
  qq->head = NULL;
  qq->tail = NULL;
  qq->size = 0;
}
void QueuePush(Q* qq, DataType x)
{
  assert(qq);
  Queue* temp = (Queue*)malloc(sizeof(Queue));
  if (temp == NULL)
  {
    perror("malloc fail");
    exit(-1);
  }
  temp->data = x;
  temp->next = NULL;
  if (qq->tail == NULL)
    qq->head = qq->tail = temp;
  else
  {
    qq->tail->next = temp;
    qq->tail = temp;
  }
  qq->size++;
}
void QueuePop(Q* qq)
{
  assert(qq);
  assert(!Empty(qq));
  if (qq->head == qq->tail)
  {
    free(qq->head);
    qq->head = qq->tail = NULL;
  }
  else
  {
    Queue* next = qq->head->next;
    free(qq->head);
    qq->head = next;
  }
  qq->size--;
}
DataType GetQueueFrontNum(Q* qq)
{
  assert(qq);
  assert(!Empty(qq));
  return qq->head->data;
}
DataType GetQueueBackNum(Q* qq)
{
  assert(qq);
  assert(!Empty(qq));
  return qq->tail->data;
}
bool Empty(Q* qq)
{
  assert(qq);
  return qq->size == 0;
}
void Destroy(Q* qq)
{
  assert(qq);
  Queue *cur = qq->head;
    while(cur)
    {
        Queue *next = cur->next;
        free(cur);
        cur = next;
    }
    qq->head = qq->tail = NULL;
    qq->size = 0;
}
int Size(Q* qq)
{
  assert(qq);
  return qq->size;
}

剩下的就是题目接口:

typedef struct {
    Q q1;
    Q q2;
} MyStack;
MyStack* myStackCreate() 
{
    MyStack *st = (MyStack*)malloc(sizeof(MyStack));
    Init(&st->q1);
    Init(&st->q2);
    return st;
}
void myStackPush(MyStack* obj, int x) 
{
    if(!Empty(&obj->q1))
    {
        QueuePush(&obj->q1,x);
    }
    else
    {
        QueuePush(&obj->q2,x);
    }
}
int myStackPop(MyStack* obj) 
{
    Q *empty = &obj->q1;
    Q *obempty = &obj->q2;
    if(!Empty(&obj->q1))
    {
        empty = &obj->q2;
        obempty = &obj->q1;
    }
    int sz = Size(obempty) - 1;
    for(int i=0; i<sz; i++)
    {
        QueuePush(empty,GetQueueFrontNum(obempty));
        QueuePop(obempty);
    }
    int num = GetQueueFrontNum(obempty);
    QueuePop(obempty);
    return num;
}
int myStackTop(MyStack* obj) 
{
    if(!Empty(&obj->q1))
    {
        return GetQueueBackNum(&obj->q1);
    }
    else
    {
        return GetQueueBackNum(&obj->q2);
    }   
}
bool myStackEmpty(MyStack* obj) 
{
    return (&obj->q1)->size == 0 && (&obj->q2)->size == 0;
}
void myStackFree(MyStack* obj) 
{
    Destroy(&obj->q1);
    Destroy(&obj->q2);
    free(obj);
}


目录
相关文章
|
14天前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
90 9
|
1月前
|
程序员 C语言
【C语言】LeetCode(力扣)上经典题目
【C语言】LeetCode(力扣)上经典题目
|
1月前
|
C语言
数组栈的实现(C语言描述)
本文介绍了如何在C语言中使用数组来实现栈的数据结构,包括栈的创建、入栈、出栈、获取栈顶元素、检查栈是否为空、获取栈的大小以及销毁栈等操作,并提供了相应的函数实现。
25 1
|
1月前
【LeetCode 24】225.用队列实现栈
【LeetCode 24】225.用队列实现栈
10 0
|
1月前
|
算法
【LeetCode 23】232.用栈实现队列
【LeetCode 23】232.用栈实现队列
18 0
|
2月前
|
存储 人工智能 C语言
数据结构基础详解(C语言): 栈的括号匹配(实战)与栈的表达式求值&&特殊矩阵的压缩存储
本文首先介绍了栈的应用之一——括号匹配,利用栈的特性实现左右括号的匹配检测。接着详细描述了南京理工大学的一道编程题,要求判断输入字符串中的括号是否正确匹配,并给出了完整的代码示例。此外,还探讨了栈在表达式求值中的应用,包括中缀、后缀和前缀表达式的转换与计算方法。最后,文章介绍了矩阵的压缩存储技术,涵盖对称矩阵、三角矩阵及稀疏矩阵的不同压缩存储策略,提高存储效率。
383 8
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
56 6
|
3月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
113 2
|
18天前
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
16 1