zoukankan      html  css  js  c++  java
  • CCI_Q3.1

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

    Q:

    你如何只用一个数组实现三个栈?

    思路:

    创建一个结构数组sn,数组中的每个元素将是这样一个结点,它保存当前位置的值item,和指向上一个结点的索引preindex。这样弹出该栈的栈顶值时,可以找到上一个该栈元素。

    注意:当弹出栈顶值时,如果该栈顶索引小于数组当前的索引C,那么将C指向该栈顶索引。这样可以不浪费空间。

    CODE:

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 #define N 10
     4 #define EMPTY -2
     5 typedef struct stackNode
     6 {
     7     int item;
     8     int preindex;//该数据的前一个数据的位置。
     9 }stackNode;
    10 int C,sntop[3];stackNode *sn;
    11 void initStackNode(int n)
    12 {
    13     sn=malloc(sizeof(stackNode)*n);
    14     int i;
    15     for(i=0;i<N;i++)
    16     {
    17         sn[i].preindex=EMPTY;//代表空位置。
    18     }
    19     C=0;//数组下标
    20     sntop[0]=sntop[1]=sntop[2]=-1;//3个栈的栈顶位置
    21 }
    22 void stackNodePush(int i,int stacknum)
    23 {
    24     if(C==N)//栈满
    25         return;
    26     if(sn[C].preindex==EMPTY)
    27     {
    28         sn[C].item=i;
    29         sn[C].preindex=sntop[stacknum];//将新数据指向前一个位置。
    30         sntop[stacknum]=C;//新的栈顶位置
    31     }
    32     else
    33     {
    34         int i;
    35         for(i=C+1;i<N;i++)//找到空位置
    36         {
    37             if(sn[i].preindex==EMPTY)
    38                 break;
    39         }
    40         C=i;
    41         sn[C].item=i;
    42         sn[C].preindex=sntop[stacknum];
    43         sntop[stacknum]=C;
    44     }
    45     ++C;
    46 }
    47 int stackNodePop(int stacknum)
    48 {
    49     int t=EMPTY;
    50     if(sntop[stacknum]==-1)//该栈为空
    51         return EMPTY;
    52     if(sntop[stacknum]<C)//如果该栈顶在C的下面,将C指向它
    53     {
    54         C=sntop[stacknum];
    55         sntop[stacknum]=sn[C].preindex;
    56         sn[C].preindex=EMPTY;
    57         t=sn[C].item;
    58     }
    59     else//否则弹出该栈顶数据,并将改位置设为空
    60     {
    61         int a=sntop[stacknum];
    62         sntop[stacknum]=sn[a].preindex;
    63         sn[a].preindex=EMPTY;
    64         t=sn[a].item;
    65     }
    66     return t;
    67 }
    68 int main()
    69 {
    70     initStackNode(N);
    71     stackNodePush(2,2);
    72     stackNodePush(1,1);
    73     stackNodePush(0,0);
    74     stackNodePush(2,2);
    75     stackNodePush(1,1);
    76     stackNodePush(2,2);
    77     stackNodePush(0,0);
    78     stackNodePush(2,2);
    79     stackNodePush(1,1);
    80     stackNodePush(1,1);//插入了10个数据
    81     stackNodePop(2);
    82     stackNodePop(0);//弹出了2个
    83     stackNodePush(0,0);
    84     stackNodePush(0,0);//又插入了2个
    85     int i;
    86     for(i=0;i<3;++i)
    87     {
    88         int t;
    89         printf("%d:",i);
    90         while((t=stackNodePop(i))!=EMPTY)
    91             printf("	%d",t);
    92         printf("
    ");
    93 
    94     }
    95 }
  • 相关阅读:
    LUA表的引用理解
    UNITY 打包安卓APK
    UNITY打包问题
    U3D 打包时找不到tag的问题
    break prefab instance的原理
    C#调用LUA函数
    LUA 利用#遍历表的问题
    U3D笔记11:47 2016/11/30-15:15 2016/12/19
    Unity3D 预设打包的注意事项
    回调 和 覆盖
  • 原文地址:https://www.cnblogs.com/jhooon/p/3591293.html
Copyright © 2011-2022 走看看