力扣 225. 用队列实现栈(C语言实现)

简介: 用C语言实现的队列和栈

1.解题思路
这道题如果使用C++会好写的多,因为可以使用C++提供的队列来实现,但如果使用C语言则必须手写一个队列来实现,在这里我用了我前面文章中实现好的队列来解答,首先因为队列是先进先出,而栈是后进后出,因此我们可以设计两个队列,其中一个队列放数据,另一个队列为空,当使用POP接口出栈时,则可将队列一的前N-1个数据挪到队列二上,这样一来,队列一剩余的那个数就为要出栈的数,即这道题的精髓就是两个队列之间数据的传递.

2.代码实现
队列实现代码:

typedef int QDataType;
// 链式结构:表示队列 
typedef struct QListNode
{
    struct QListNode* _next;
    QDataType _data;
}QNode;
// 队列的结构 
typedef struct Queue
{
    QNode* _front;
    QNode* _rear;
}Queue;

void QueueInit(Queue* q)
{
    assert(q);
    q->_front = NULL;
    q->_rear = NULL;

}
void QueuePush(Queue* q, QDataType data)
{
    assert(q);
    if (q->_front == NULL)
    {
        QNode* tmp = (QNode*)malloc(sizeof(QNode));
        tmp->_data = data;
        tmp->_next = NULL;
        q->_front = q->_rear = tmp;
    }
    else
    {
        QNode* tmp = (QNode*)malloc(sizeof(QNode));
        tmp->_data = data;
        tmp->_next = NULL;
        q->_rear->_next = tmp;
        q->_rear = tmp;
    }


}
void QueuePop(Queue* q)
{
    assert(q->_front != NULL);
    QNode* tmp = q->_front->_next;
    free(q->_front);
    q->_front = tmp;

}
QDataType QueueFront(Queue* q)
{
    assert(q->_front);
    return q->_front->_data;


}
QDataType QueueBack(Queue* q)
{
    assert(q->_rear);
    return q->_rear->_data;
}
int QueueSize(Queue* q)
{
    QNode* tmp = q->_front;
    int num = 0;
    while (tmp)
    {
        num++;
        tmp = tmp->_next;
    }
    return num;

}
bool QueueEmpty(Queue* q)
{
    return q->_front == NULL;

}
void QueueDestroy(Queue* q)
{
    QNode* tmp = q->_front;
    while (tmp)
    {
        QNode* next = tmp->_next;
        free(tmp);
        tmp = next;
    }

}

解题接口代码:

typedef struct {
    Queue q1;
    Queue q2;
} MyStack;


MyStack* myStackCreate()
{
    MyStack* s = (MyStack*)malloc(sizeof(MyStack));
    QueueInit(&s->q1);
    QueueInit(&s->q2);
}

void myStackPush(MyStack* obj, int x) {
    if (!QueueEmpty(&obj->q1))
    {
        QueuePush(&obj->q1, x);
    }
    else
    {
        QueuePush(&obj->q2, x);
    }
}

int myStackPop(MyStack* obj) {
    Queue* p1 = &obj->q1;
    Queue* p2 = &obj->q2;
    if (!QueueEmpty(&obj->q2))
    {
        p1 = &obj->q2;
        p2 = &obj->q1;
    }
    while (QueueSize(p1)>1)
    {
        QueuePush(p2, QueueFront(p1));
        QueuePop(p1);
    }
    int tmp = p1->_front->_data;
    QueuePop(p1);
    return tmp;
}

int myStackTop(MyStack* obj) {
    if (!QueueEmpty(&obj->q1))
        return QueueBack(&obj->q1);
    else
    {
        return QueueBack(&obj->q2);
    }

}

bool myStackEmpty(MyStack* obj) {
    if (!QueueEmpty(&obj->q1) || QueueEmpty(&obj->q2))
        return false;
    else
        return true;
}

void myStackFree(MyStack* obj) {
    QueueDestroy(&obj->q1);
    QueueDestroy(&obj->q2);
}

结尾:今天的分享到此结束,喜欢的朋友如果感觉有帮助可以点赞三连支持,咱们共同进步!

目录
相关文章
|
2月前
|
存储 算法 测试技术
力扣经典150题第五十四题:最小栈
力扣经典150题第五十四题:最小栈
27 0
|
3月前
|
存储 算法 索引
力扣每日一题 6/24 模拟 数组 单调栈
力扣每日一题 6/24 模拟 数组 单调栈
23 0
|
2天前
|
存储 C语言
数据结构基础详解(C语言): 栈与队列的详解附完整代码
栈是一种仅允许在一端进行插入和删除操作的线性表,常用于解决括号匹配、函数调用等问题。栈分为顺序栈和链栈,顺序栈使用数组存储,链栈基于单链表实现。栈的主要操作包括初始化、销毁、入栈、出栈等。栈的应用广泛,如表达式求值、递归等场景。栈的顺序存储结构由数组和栈顶指针构成,链栈则基于单链表的头插法实现。
|
1月前
|
Python
【Leetcode刷题Python】剑指 Offer 30. 包含min函数的栈
本文提供了实现一个包含min函数的栈的Python代码,确保min、push和pop操作的时间复杂度为O(1)。
16 4
|
1月前
|
Python
【Leetcode刷题Python】946. 验证栈序列
LeetCode题目“946. 验证栈序列”的Python解决方案,通过模拟栈的压入和弹出操作来验证给定的两个序列是否能通过合法的栈操作得到。
20 6
|
1月前
|
Python
【Leetcode刷题Python】剑指 Offer 09. 用两个栈实现队列
使用两个栈实现队列的Python解决方案,包括初始化两个栈、实现在队列尾部添加整数的appendTail方法和在队列头部删除整数的deleteHead方法,以及相应的示例操作。
31 2
|
1月前
|
Python
【Leetcode刷题Python】641.循环双端队列
文章介绍了如何实现一个循环双端队列,包括其操作如插入、删除、获取队首和队尾元素,以及检查队列是否为空或已满,并提供了Python语言的实现代码。
15 0
|
1月前
|
Python
【Leetcode刷题Python】232. 用栈实现队列
如何使用Python语言通过两个栈来实现队列的所有基本操作,包括入队(push)、出队(pop)、查看队首元素(peek)和判断队列是否为空(empty),并提供了相应的代码实现。
14 0
|
3月前
|
C语言
C语言的栈帧
C语言的栈帧
|
2月前
|
Python
155. 最小栈 力扣 python 空间换时间 o(1) 腾讯面试题
155. 最小栈 力扣 python 空间换时间 o(1) 腾讯面试题