• CCI_Q3.3


    本文参考该作者文章当作编程笔记:
    
    作者:Hawstein
    出处:http://hawstein.com/posts/ctci-solutions-contents.html

    Q:

    栈就像叠盘子,当盘子叠得太高时,就会倾斜倒下。因此,在真实的世界中,当一叠盘子 (栈)超过了一定的高度时,我们就会另起一堆,再从头叠起。实现数据结构SetOfStacks 来模拟这种情况。SetOfStacks由几个栈组成,当前一栈超出容量时,需要创建一个新的栈 来存放数据。SetOfStacks.push()和SetOfStacks.pop()的行为应当和只有一个栈时 表现的一样。

    进一步地,

    实现函数popAt(int index)在指定的子栈上进行pop操作。

    思路:

    我感觉和在一个数组实现3个栈是一样的(不然是我没看懂题。)。那就简单了,实现一个数组,需要3个top索引(p_cur[])来记录3个栈的数据情况。

    popAt()函数没实现。

    CODE:

    实现:stack.c:

     1 #include<stdlib.h>
     2 #include"stack.h"
     3 int C;
     4 Item *stack;
     5 void STACKinit(int n)
     6 {
     7     stack=malloc(sizeof(int)*n);
     8     C=0;
     9 }
    10 int STACKempty()
    11 {
    12     return C==0;
    13 }
    14 void STACKpush(Item i)
    15 {
    16     stack[C++]=i;
    17 }
    18 Item STACKpop()
    19 {
    20     return stack[--C];
    21 }
    22 Item STACKtop()
    23 {
    24     return stack[C-1];
    25 }
    26 int STACKfull(int n)
    27 {
    28     if(C==0)
    29         return 0;
    30     else if(C%n==0)
    31         return 1;
    32     else
    33         return 0;
    34 }

    客户:

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 #include<stdarg.h>
     4 #include<memory.h>
     5 #define N 10                        /*一个栈的长度*/
     6 #define M 3    /*3个栈*/                           
     7 int p_cur[M],p_cur_i=0;/*3个栈的top索引*/
     8 void stackInit()
     9 {
    10     STACKinit(N*M);
    11     memset(p_cur,0,sizeof(int)*M);
    12 }
    13 void stackPush(int i)
    14 {
    15     if(p_cur[M-1]==N)/*第3个栈已经到顶部*/
    16         return;
    17     if(STACKfull(N)==1)/*如果一个栈已满,到下一个栈*/
    18     {
    19         ++p_cur[++p_cur_i];
    20         STACKpush(i);
    21     }
    22     else
    23     {
    24         ++p_cur[p_cur_i];
    25         STACKpush(i);
    26     }
    27 }
    28 int stackPop()
    29 {
    30     if(STACKempty())/*数组为空*/
    31         return;
    32     if(p_cur[p_cur_i]==0)/*到达一个栈的底部,回到前一个栈*/
    33     {
    34         --p_cur[--p_cur_i];
    35     }
    36     else
    37     {
    38         --p_cur[p_cur_i];
    39     }
    40     return STACKpop();
    41 }
    42 int main()
    43 {
    44     stackInit();
    45     int i;
    46     for(i=0;i<N+3;i++)
    47     {
    48         stackPush(i);
    49         printf("%d %d	",p_cur_i,p_cur[p_cur_i]);
    50     }
    51     printf("
    ");
    52     for(i=N+2;i>0;i--)
    53     {
    54         printf("%d:",stackPop());
    55         printf("%d %d	",p_cur_i,p_cur[p_cur_i]);
    56     }
    57     printf("
    ");
    58     return 0;
    59 }
  • 相关阅读:
    $.ajax
    es6--之箭头函数
    vuex相关知识点
    grunt---grunt_test 测试用例
    git2--常用命令
    git命令
    百万程序员的苦恼-选择VB.NET还是C#
    在Linux上运行C#
    C#中的cookie编程
    C#编程让Outlook乖乖交出帐户密码
  • 原文地址:https://www.cnblogs.com/jhooon/p/3597812.html
Copyright © 2020-2023  润新知