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

  • 相关阅读:
    pandas基本操作
    MySQL数据库(五)使用pymysql对数据库进行增删改查
    MySQL数据库(四)多表查询
    MySQL数据库(三)索引总结
    MySQL数据库(二)-数据库的增删改查
    MySQL数据库(一)
    Linux 解压/压缩xxx.zip格式(unZip Zip的安装和使用)
    关系型数据库和非关系型数据库的对比
    进程、线程、协程的区别
    python迭代器与生成器详解
  • 原文地址:https://www.cnblogs.com/yinguojin/p/14311036.html
Copyright © 2011-2022 走看看