力扣 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);

}

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

目录
相关文章
|
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) 腾讯面试题