zoukankan      html  css  js  c++  java
  • 栈和队列算法设计题3.15

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

     C  code:

     #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;
    }
  • 相关阅读:
    LA 6621 /ZOJ 3736 Pocket Cube 打表+暴力
    UVA 10273
    UVA 10158 并查集的经典应用
    CodeForces 382B 数学推导
    UVA 10806 最小费用最大流
    UVA 10330 最大流
    图论:匹配与覆盖+独立集 团与支配集
    sdut oj 操作系统实验--SSTF磁盘调度算法【操作系统算法】
    【转载】单调队列学习
    poj 3006 Dirichlet's Theorem on Arithmetic Progressions【素数问题】
  • 原文地址:https://www.cnblogs.com/cpoint/p/2038306.html
Copyright © 2011-2022 走看看