• 用两个栈实现队列(剑指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)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 相关阅读:
    安装系统时碰上hal.dll文件丢失或损坏问题
    系统无法停止USB接口的“通用卷”的解决方法
    提取嵌入excel或word中flash的VBA代码
    打印机的PCL驱程和PS驱程的区别!
    spoolsv.exe占用资源的解决方法
    检测硬盘与内存中的隐藏病毒
    关于Windows默认共享的一些认识
    SmartClient + WebServices 开发 1
    常用 ajax 框架比较摘自网络
    AJAX 框架 Prototype
  • 原文地址:https://www.cnblogs.com/yinguojin/p/14311036.html
Copyright © 2020-2023  润新知