- 先明确思路:用两个栈实现一个队列。队列的特点是先进先出。栈的特点是先进后出。
- 定义两个栈,一个栈是stack_in,另一个栈是stack_out。stack_out这个栈专门实现pop操作,stack_in实现队列的其他基本操作。
- 移除栈的一个元素与移除队列的一个元素的顺序相比较的话,发现顺序刚好是相反的。队列要移除的元素刚好在栈的底部。这时,我们借助stack_out这个栈来实现此操作。将stack_in中的元素先全部出栈,再将这些元素全部入栈到stack_out中,这时出栈(此时栈为stack_out)的顺序与队列一致。
- 出栈完成之后,再将stack_out的元素按照同样的方法入栈到stack_in中,以免干扰其余的操作。
typedef struct{
int * data;
int top;
} Mystack;
typedef struct {
Mystack* stack_in;
Mystack* stack_out;
} MyQueue;
Mystack* mystackcreate(){
Mystack* q=malloc(sizeof(Mystack));
q->data=malloc(sizeof(int)*80);
q->top=-1;
return q;
}
void mystack_push(Mystack* q,int val){
q->top++;
q->data[q->top]=val;
}
int mystack_pop(Mystack* q){
int tmp=q->data[q->top];
q->top--;
return tmp;
}
int mystack_isempty(Mystack* q){
if(q->top==-1) return 1;
return 0;
}
int mystack_gettop(Mystack* q){
return q->data[q->top];
}
MyQueue* myQueueCreate() {
MyQueue* obj=malloc(sizeof(MyQueue));
obj->stack_in=mystackcreate();
obj->stack_out=mystackcreate();
return obj;
}
void myQueuePush(MyQueue* obj, int x) {
mystack_push(obj->stack_in,x);
}
int myQueuePop(MyQueue* obj) {
while(!mystack_isempty(obj->stack_in)){
mystack_push(obj->stack_out,mystack_gettop(obj->stack_in));
mystack_pop(obj->stack_in);
}
int tmp=mystack_gettop(obj->stack_out);
mystack_pop(obj->stack_out);
while(!mystack_isempty(obj->stack_out)){
mystack_push(obj->stack_in,mystack_gettop(obj->stack_out));
mystack_pop(obj->stack_out);
}
return tmp;
}
int myQueuePeek(MyQueue* obj) {
int tmp=obj->stack_in->data[0];
return tmp;
}
bool myQueueEmpty(MyQueue* obj) {
if(obj->stack_in->top==-1) return true;
return false;
}
void myQueueFree(MyQueue* obj) {
free(obj->stack_in);
free(obj->stack_out);
free(obj);
}
作者:。。。。
链接:https://leetcode.cn/problems/implement-queue-using-stacks/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。