目录
1 力扣_225 用队列实现栈
链接:力扣-用队列实现栈
1.1 示例
1.2 注意
-
使用纯
C
来实现,由于没有STL
库,需要自己手动先行实现,会有点复杂。 -
而代码中所有
Queue
接口函数都在我上一篇文章队列 的认识及简单实现中有实现 -
实现时不能改变队列结构,只能去调用队列提供的接口函数去实现
1.3 思路
首先,由于C
中没有STL
库,我们需要手动创建队列,并实现其中的接口函数,再在题目中加入以便使用。
创建栈
typedef struct
{
Queue q1;
Queue q2;
} MyStack;
MyStack* myStackCreate()
{
MyStack*st=(MyStack*)malloc(sizeof(MyStack));
QueueInit(&st->q1);
QueueInit(&st->q2);
return st; // malloc出的,所以出了接口还在,而一般的局部变量会销毁
}
1.3.1 插入数据
void myStackPush(MyStack* st, int x) {
if (!QueueEmpty(&st->q1))// q1不为空,说明有数据,则插入数据到其后面
{
QueuePush(&st->q1, x);
}
else
{
QueuePush(&st->q2, x);// 否则插入到q2。同时包含q1和q2同时为空的情况,则插入哪个都行。
}
}
1.3.2 删除并返回栈顶元素
int myStackPop(MyStack* st) {
Queue* EmptyQ = &st->q1; // 默认使q1为空,q2不为空,进行下面代码
Queue* NoneEmptyQ = &st->q2;
if (!QueueEmpty(&st->q1)) // q1不为空返回假,!后返回真
{ // 若q1不为空,q2为空,二者交换即可
EmptyQ = &st->q2;
NoneEmptyQ = &st->q1;
}
while (QueueSize(NoneEmptyQ) > 1) // 删除队尾前的所有数据,直至到队尾
{
QueuePush(EmptyQ, QueueFront(NoneEmptyQ));
// 分别用队列的两个接口函数,先取出非空队列中的元素,再将其插入到空队列中
QueuePop(NoneEmptyQ);
}
// 已经到队尾,则Pop掉最后的数据
int number = QueueFront(NoneEmptyQ);// 提前保存最后一个,因为题目中要返回该元素
QueuePop(NoneEmptyQ);
return number;
}
1.3.3 返回栈顶元素
int myStackTop(MyStack* st) {
if (!QueueEmpty(&st->q1))
{ // 谁不为空,返回谁的队尾
return QueueBack(&st->q1);
}
else
{
return QueueBack(&st->q2);
}
}
1.3.4 判断栈是否为空
bool myStackEmpty(MyStack* st) {
// 判断栈是否为空,即判断2个队列是否都为空
return QueueEmpty(&st->q1) && QueueEmpty(&st->q2);
}
1.3.5 free栈
void myStackFree(MyStack* st) {
free(st);
}
所以要先用接口函数将2个队列中的元素删除,再将结构体st
给free
void myStackFree(MyStack* st) {
QueueDestroy(&st->q1);
QueueDestroy(&st->q2);
free(st);
}