假设以顺序存储结构实现一个双向栈,即在一维数组的存储空间中存在着两个栈,它们的栈底分别设在数组的两个端点。试编写实现这个双向栈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 ;
}
#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 ;
}