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

}

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

目录
相关文章
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
607 5
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
1360 10
【LeetCode 24】225.用队列实现栈
【LeetCode 24】225.用队列实现栈
170 0
|
算法
【LeetCode 23】232.用栈实现队列
【LeetCode 23】232.用栈实现队列
159 0
|
存储 C语言
数据结构基础详解(C语言): 栈与队列的详解附完整代码
栈是一种仅允许在一端进行插入和删除操作的线性表,常用于解决括号匹配、函数调用等问题。栈分为顺序栈和链栈,顺序栈使用数组存储,链栈基于单链表实现。栈的主要操作包括初始化、销毁、入栈、出栈等。栈的应用广泛,如表达式求值、递归等场景。栈的顺序存储结构由数组和栈顶指针构成,链栈则基于单链表的头插法实现。
2238 3
|
11月前
|
存储 C语言
`scanf`是C语言中用于按格式读取标准输入的函数
`scanf`是C语言中用于按格式读取标准输入的函数,通过格式字符串解析输入并存入指定变量。需注意输入格式严格匹配,并建议检查返回值以确保读取成功,提升程序健壮性。
1581 0
|
安全 C语言
C语言中的字符、字符串及内存操作函数详细讲解
通过这些函数的正确使用,可以有效管理字符串和内存操作,它们是C语言编程中不可或缺的工具。
538 15
|
人工智能 Java 程序员
一文彻底搞清楚C语言的函数
本文介绍C语言函数:函数是程序模块化的工具,由函数头和函数体组成,涵盖定义、调用、参数传递及声明等内容。值传递确保实参不受影响,函数声明增强代码可读性。君志所向,一往无前!
704 1
一文彻底搞清楚C语言的函数
|
存储 编译器 C语言
【C语言程序设计——函数】分数数列求和2(头歌实践教学平台习题)【合集】
函数首部:按照 C 语言语法,函数的定义首部表明这是一个自定义函数,函数名为fun,它接收一个整型参数n,用于指定要求阶乘的那个数,并且函数的返回值类型为float(在实际中如果阶乘结果数值较大,用float可能会有精度损失,也可以考虑使用double等更合适的数据类型,这里以float为例)。例如:// 函数体代码将放在这里函数体内部变量定义:在函数体中,首先需要定义一些变量来辅助完成阶乘的计算。比如需要定义一个变量(通常为float或double类型,这里假设用float。
768 3