1 题目
剑指 Offer 09. 用两个栈实现队列 - 力扣(LeetCode) (leetcode-cn.com)
2 思路
利用栈先进后出的特点,用一个栈作为中间量,将数据存到一个栈中,在将第一个栈的数据出栈存入另外一个栈即可实现队列。
队列尾元素的添加:
尾元素的添加只能是在1栈中进行 具体实现看注释
队列首元素的删除:
首元素的删除只能是在2栈中进行 具体实现看注释
3 代码
typedef struct {
int top1;
int* stack1;
int top2;
int* stack2;
int len;//每个栈的长度
} 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);
}