【leetcode C语言实现】剑指 Offer 09.用两个栈
题目描述
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
示例 1:
输入:
["CQueue","appendTail","deleteHead","deleteHead"]
[[],[3],[],[]]
输出:[null,null,3,-1]
示例 2:
输入:
["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
[[],[],[5],[2],[],[]]
输出:[null,-1,null,null,5,2]
提示:
1 <= values <= 10000
最多会对 appendTail、deleteHead 进行 10000 次调用
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof
解题思路
由于栈是‘先进后出’的结构,而队列是‘先进先出’的结构,用两个栈实现一个队列时,可以先把元素压入栈1,然后从栈顶到栈底依次弹出元素到栈2,这样栈2的栈顶就是最先‘入队’的元素了。由前面的分析可以看出,当在队列尾部添加元素时,需将元素添加到栈1,若栈1中有元素,直接将需添加的元素压入已有元素的顶部即可,若栈1中没有元素,则需要将需添加的元素放入队列中对应的位置,可采取将栈2中的元素移到栈1,再在栈1的栈顶压入需添加的元素,这样就实现了在尾部添加元素的功能。同理,当需要在队列中删除头部元素时,判断栈2中是否有元素,若有,直接弹出栈顶元素即为头部元素,若栈2为空,则将栈1中的元素都移至栈1,再弹出栈顶元素。
代码
typedef struct {
int len;
int top1;
int top2;
int *stack1;
int *stack2;
} CQueue;
CQueue* cQueueCreate() {
CQueue *queue = (CQueue *)malloc(sizeof(CQueue));
queue->len = 10000;
queue->top1 = -1;
queue->top2 = -1;
queue->stack1 = malloc(queue->len * sizeof(int));
queue->stack2 = malloc(queue->len * sizeof(int));
return queue;
}
void cQueueAppendTail(CQueue* obj, int value) {
if(obj->top1 == -1)
{
while(obj->top2 != -1)
{
obj->stack1[++(obj->top1)] = obj->stack2[obj->top2--];
}
}
obj->stack1[++(obj->top1)] = value;
}
int cQueueDeleteHead(CQueue* obj) {
if(obj->top2 == -1)
{
while(obj->top1 != -1)
{
obj->stack2[++(obj->top2)] = obj->stack1[(obj->top1)--];
}
}
return obj->top2 == -1 ? -1 : obj->stack2[obj->top2--];
}
void cQueueFree(CQueue* obj) {
free(obj->stack1);
free(obj->stack2);
free(obj);
}
/**
* Your CQueue struct will be instantiated and called as such:
* CQueue* obj = cQueueCreate();
* cQueueAppendTail(obj, value);
* int param_2 = cQueueDeleteHead(obj);
* cQueueFree(obj);
*/