• 栈和队列算法设计题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;
    }
  • 相关阅读:
    Activity的四种launchMode
    Activity及Intent
    关于android中PendingIntent.getBroadcase的注册广播
    C# Parallel用法
    用Parallel.For()和Parallel.For<TLocal>()方法实现并行运行迭代
    CursorAdapter中getView newView bindView异同
    Android四大组件之ContentProvider
    Android 自动换行流式布局的RadioGroup
    真机无法接收到android.provider.Telephony.SMS_RECEIVED的问题
    Wiz开发 定时器的使用与处理
  • 原文地址:https://www.cnblogs.com/cpoint/p/2038306.html
Copyright © 2020-2023  润新知