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

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

1.解题思路
利用两个栈,设栈s1为入栈,s2为出栈,则当s2为空时,出队列只能将s1的后N-1项挪到s2后剩下的就为出栈的项,但如果s2不为空那就说明此时s2栈中的元素就已经是按照队列的顺序排好了,直接出栈即可.
2.代码实现
栈的实现代码:

typedef int STDataType;
typedef struct Stack
{
    STDataType* _a;
    int _top;        // 栈顶
    int _capacity;  // 容量 
}Stack;
void StackInit(Stack* ps)
{
    assert(ps);
    ps->_a = NULL;
    ps->_capacity = 0;
    ps->_top = 0;
}
void StackPush(Stack* pst, STDataType x)
{
    assert(pst);

    if (pst->_top == pst->_capacity)
    {
        int newcapacity = pst->_capacity == 0 ? 4 : pst->_capacity * 2;
        STDataType* tmp = (STDataType*)realloc(pst->_a, sizeof(STDataType) * newcapacity);
        if (tmp == NULL)
        {
            perror("realloc fail");
            return;
        }

        pst->_a = tmp;
        pst->_capacity = newcapacity;
    }

    pst->_a[pst->_top] = x;
    pst->_top++;
}
void StackPop(Stack* ps)
{
    assert(ps->_top > 0);
    ps->_top--;

}
STDataType StackTop(Stack* ps)
{

    return ps->_a[ps->_top - 1];

}
int StackSize(Stack* ps)
{
    return ps->_top;

}
bool StackEmpty(Stack* ps)
{
    return ps->_top == 0;

}
void StackDestroy(Stack* ps)
{
    free(ps->_a);
    ps->_capacity = 0;
    ps->_top = 0;

}

解题代码:

typedef struct {
    Stack s1;
    Stack s2;
} MyQueue;


MyQueue* myQueueCreate() {

    MyQueue* m = (MyQueue*)malloc(sizeof(MyQueue));
    StackInit(&m->s1);
    StackInit(&m->s2);
}

void myQueuePush(MyQueue* obj, int x) {

    StackPush(&obj->s1, x);

}

int myQueuePop(MyQueue* obj) {
    if (!StackEmpty(&obj->s2))
    {
        int tmp = StackTop(&obj->s2);
        StackPop(&obj->s2);
        return tmp;
    }
    else
    {
        while (StackSize(&obj->s1) > 1)
        {
            int tmp = StackTop(&obj->s1);
            StackPush(&obj->s2, tmp);
            StackPop(&obj->s1);
        }
        int tmp1 = StackTop(&obj->s1);
        StackPop(&obj->s1);
        return tmp1;
    }
}


int myQueuePeek(MyQueue* obj) {
    if (!StackEmpty(&obj->s1))
    {
        return obj->s1._a[0];
    }
    else
    {
        return obj->s2._a[obj->s2._top - 1];
    }

}

bool myQueueEmpty(MyQueue* obj) {

    if (StackEmpty(&obj->s1) && StackEmpty(&obj->s2))
        return true;
    else
        return false;

}

void myQueueFree(MyQueue* obj) {

    StackDestroy(&obj->s1);
    StackDestroy(&obj->s2);

}

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

目录
相关文章
|
27天前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
123 9
|
5天前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
26 5
|
2月前
|
程序员 C语言
【C语言】LeetCode(力扣)上经典题目
【C语言】LeetCode(力扣)上经典题目
|
2月前
|
C语言
数组栈的实现(C语言描述)
本文介绍了如何在C语言中使用数组来实现栈的数据结构,包括栈的创建、入栈、出栈、获取栈顶元素、检查栈是否为空、获取栈的大小以及销毁栈等操作,并提供了相应的函数实现。
35 1
|
2月前
【LeetCode 24】225.用队列实现栈
【LeetCode 24】225.用队列实现栈
12 0
|
2月前
|
算法
【LeetCode 23】232.用栈实现队列
【LeetCode 23】232.用栈实现队列
19 0
|
3月前
|
存储 人工智能 C语言
数据结构基础详解(C语言): 栈的括号匹配(实战)与栈的表达式求值&&特殊矩阵的压缩存储
本文首先介绍了栈的应用之一——括号匹配,利用栈的特性实现左右括号的匹配检测。接着详细描述了南京理工大学的一道编程题,要求判断输入字符串中的括号是否正确匹配,并给出了完整的代码示例。此外,还探讨了栈在表达式求值中的应用,包括中缀、后缀和前缀表达式的转换与计算方法。最后,文章介绍了矩阵的压缩存储技术,涵盖对称矩阵、三角矩阵及稀疏矩阵的不同压缩存储策略,提高存储效率。
435 8
|
3月前
|
存储 C语言
数据结构基础详解(C语言): 栈与队列的详解附完整代码
栈是一种仅允许在一端进行插入和删除操作的线性表,常用于解决括号匹配、函数调用等问题。栈分为顺序栈和链栈,顺序栈使用数组存储,链栈基于单链表实现。栈的主要操作包括初始化、销毁、入栈、出栈等。栈的应用广泛,如表达式求值、递归等场景。栈的顺序存储结构由数组和栈顶指针构成,链栈则基于单链表的头插法实现。
417 3
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 30. 包含min函数的栈
本文提供了实现一个包含min函数的栈的Python代码,确保min、push和pop操作的时间复杂度为O(1)。
29 4
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 09. 用两个栈实现队列
使用两个栈实现队列的Python解决方案,包括初始化两个栈、实现在队列尾部添加整数的appendTail方法和在队列头部删除整数的deleteHead方法,以及相应的示例操作。
40 2