用两个栈实现队列(剑指09题)

解题思路
队列可以用链表实现,而且链表实现的代码思路比较清晰,添加节点,头节点后移,删除节点,尾节点后移;
队列也可以用两个栈实现,下面是思路:
1、用一个栈来存放入队值,直到存满这个栈,时间复杂度O(1);
2、另一个栈用来做出队列操作,一开始这个栈是空的,需要将入队栈的值倒序移过来,删除末尾值即可,
     如果不是第一次,则直接删除出队栈的末尾值即可,时间复杂度O(n)。

/*C语言实现*/
typedef struct { int stack1_len; int stack2_len; int *stack1; int *stack2; } CQueue; CQueue* cQueueCreate() { CQueue *que = (CQueue*)malloc(sizeof(CQueue)); if(que==NULL){ return NULL; } que->stack1_len = 0; que->stack2_len = 0; que->stack1 = malloc(10000*sizeof(int)); que->stack2 = malloc(10000*sizeof(int)); return que; } void cQueueAppendTail(CQueue* obj, int value) { if(!obj){ return; } if(obj->stack1_len>10000){ return; } obj->stack1[obj->stack1_len++] = value; return; } int cQueueDeleteHead(CQueue* obj) { if(!obj){ return -1; } int data = -1; if(obj->stack2_len>0){ data = obj->stack2[obj->stack2_len-1]; obj->stack2_len--; return data; } if(obj->stack2_len==0 && obj->stack1_len>0){ while(obj->stack1_len>0){ obj->stack2[obj->stack2_len++]=obj->stack1[--obj->stack1_len]; } data = obj->stack2[obj->stack2_len-1]; obj->stack2_len--; } return data; } void cQueueFree(CQueue* obj) { if(obj==NULL){ return; } if(obj->stack1){ free(obj->stack1); } if(obj->stack2){ free(obj->stack2); } free(obj); }

 

作者:gui-gui-da-bao
链接:https://leetcode-cn.com/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof/solution/yong-liang-ge-zhan-shi-xian-dui-lie-by-g-cvt5/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

posted @ 2021-01-21 22:58  谁的小流浪  阅读(56)  评论(0编辑  收藏  举报