• 严版数据结构题集3.15


    假设以顺序存储结构实现一个双向栈,即在一维数组的存储空间中存在着两个栈,它们的栈底分别设在数组的两个端点。试编写实现这个双向栈tws的三个操作:初始化inistack(tws)、入栈push(tws,i,x)和出栈pop(tws,i)的算法,其中i为0或1,用以分别指示设在数组两端的两个栈.

    #include<stdio.h>
    #include<stdlib.h>
    #define OK 1
    #define OVERFLOW -1
    #define ERROR 1
    typedef int Status;
    
    typedef struct
    {
     int *base[2];
     int *top[2];
    }BDStack;
    
    Status InitStack(BDStack &s,int m)
    {
      s.base[0]=(int*)malloc(m*sizeof(int));
      s.base[1]=s.base[0]+m;
      s.top[0]=s.base[0];
      s.top[1]=s.base[1];
      return OK;
    }
    
    Status push(BDStack &s,int i,int x)
    {
         if(s.top[0]>s.top[1]) return OVERFLOW;
         if(i==0)  *s.top[0]++=x;
         else if(i==1) *s.top[1]--=x;
         else return ERROR;
         return OK;
    }
    
    Status pop(BDStack &s,int i,int x)
    {
         if(i==0)
         {
              if(s.top[0]==s.base[0]) return OVERFLOW;
              x=*--s.top[0];
            }
            else if(i==1)
            {
                 if(s.top[1]==s.base[1]) return OVERFLOW;
                 x=*++s.top[1];
            }
         else return ERROR;
         return OK;
    }
    
    void PrintfStack(BDStack &s)
    {
         while(s.base[0]<=s.top[0])
         {
              printf("%d ",*s.top[0]);
              s.top[0]--;
            }
            while(s.top[1]<=s.base[1])
            {
                 printf("%d ",*s.top[1]);
                 s.top[1]++;
            }
    }
    
    int main()
    {
         int m,i;
         BDStack s;
         printf("please input the length of the stack: ");
         scanf("%d",&m);
         InitStack(s,m);
         for(i=0; i<(m-2)/2; i++)
         {
              push(s,0,i);
         }
         for(i=0; i<(m-2)/2 ; i++)
         {
              push(s,1,i);
            }
            s.top[0]--;
         s.top[1]++;
            PrintfStack(s);
            return 0;
    }

    作者:cpoint
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    jzoj3294. 【SHTSC2013】超级跳马
    jzoj3243. Cube
    jzoj3242. Spacing
    jzoj3232. 【佛山市选2013】排列
    jzoj3297. 【SDOI2013】逃考
    jzoj4800. 【GDOI2017模拟9.24】周末晚会
    学习burnside、polya小结
    学习splay或spaly小结
    一个初学者的辛酸路程-了解Python-2
    一个初学者的辛酸路程-初识Python-1
  • 原文地址:https://www.cnblogs.com/cpoint/p/3367338.html
Copyright © 2020-2023  润新知