**6-1 Two Stacks In One Array两个栈在一个排列里 (20 分)**
Write routines to implement(实现) two stacks using only one array. Your stack routines should not declare(宣告、表明) an overflow(溢出) unless every slot in the array is used.
Format(格式) of functions:
Stack CreateStack( int MaxElements );
int IsEmpty( Stack S, int Stacknum );//置空
int IsFull( Stack S );
int Push( ElementType X, Stack S, int Stacknum );
ElementType Top_Pop( Stack S, int Stacknum );
where int Stacknum is the index of a stack which is either 1 or 2(1、2号栈); int MaxElements is the size of the stack array; and Stack is defined as the following:
typedef struct StackRecord *Stack;
struct StackRecord {
int Capacity; /* maximum size of the stack array */
int Top1; /* top pointer for Stack 1 */
int Top2; /* top pointer for Stack 2 */
ElementType *Array; /* space for the two stacks */
}
Note: Push is supposed to return 1 if the operation can be done successfully, or 0 if fails. If the stack is empty, Top_Pop must return ERROR which is defined by the judge program.
Sample program of judge:
#include <stdio.h>
#include <stdlib.h>
#define ERROR 1e8 //if the stack is empty, Top_Pop must return ERROR
typedef int ElementType;
typedef enum { push, pop, end } Operation;//C 语言中,枚举类型是被当做 int 或者 unsigned int 类型来处理的
//push=0
typedef struct StackRecord *Stack;
struct StackRecord {
int Capacity; /* Capacity 容量 maximum size of the stack array */
int Top1; /* top pointer for Stack 1 */
int Top2; /* top pointer for Stack 2 */
ElementType *Array; /* space for the two stacks */
};
Stack CreateStack( int MaxElements );
int IsEmpty( Stack S, int Stacknum );
int IsFull( Stack S );
int Push( ElementType X, Stack S, int Stacknum );
ElementType Top_Pop( Stack S, int Stacknum );
Operation GetOp(); /* details omitted */
void PrintStack( Stack S, int Stacknum ); /* details omitted */
int main()
{
int N, Sn, X;
Stack S;
int done = 0;
scanf("%d", &N);
S = CreateStack(N);
while ( !done ) {
switch( GetOp() ) {
case push:
scanf("%d %d", &Sn, &X);
if (!Push(X, S, Sn)) printf("Stack %d is Full!\n", Sn);
break;
case pop:
scanf("%d", &Sn);
X = Top_Pop(S, Sn);
if ( X==ERROR ) printf("Stack %d is Empty!\n", Sn);
break;
case end:
PrintStack(S, 1);
PrintStack(S, 2);
done = 1;
break;
}
}
return 0;
}
/* Your function will be put here */
Sample Input:
5
Push 1 1
Pop 2
Push 2 11
Push 1 2
Push 2 12
Pop 1
Push 2 13
Push 2 14
Push 1 3
Pop 2
End
Sample Output:
Stack 2 is Empty!
Stack 1 is Full!
Pop from Stack 1: 1
Pop from Stack 2: 13 12 11
ing
#include <stdio.h>
#include <stdlib.h>
#define ERROR 1e8 //if the stack is empty, Top_Pop must return ERROR
typedef int ElementType;
typedef enum { push, pop, end } Operation;
//C 语言中,枚举类型是被当做 int 或者 unsigned int 类型
//push=0
typedef struct StackRecord *Stack;
struct StackRecord {
int Capacity; /* Capacity 容量 maximum size of the stack array */
int Top1; /* top pointer for Stack 1 */
int Top2; /* top pointer for Stack 2 */
ElementType *Array; /* space for the two stacks */
};
Stack CreateStack( int MaxElements );
int IsEmpty( Stack S, int Stacknum );
int IsFull( Stack S );
int Push( ElementType X, Stack S, int Stacknum );
ElementType Top_Pop( Stack S, int Stacknum );
Operation GetOp(); /* details omitted */
void PrintStack( Stack S, int Stacknum ); /* details omitted */
int main()
{
int N, Sn, X;
Stack S;
int done = 0;
scanf("%d", &N);
S = CreateStack(N);
while ( !done ) {
switch( GetOp() ) {
case push:
scanf("%d %d", &Sn, &X);
if (!Push(X, S, Sn)) printf("Stack %d is Full!\n", Sn);
break;
case pop:
scanf("%d", &Sn);
X = Top_Pop(S, Sn);
if ( X==ERROR ) printf("Stack %d is Empty!\n", Sn);
break;
case end:
PrintStack(S, 1);
PrintStack(S, 2);
done = 1;
break;
}
}
return 0;
}
/* Your function will be put here */
Stack CreateStack( int MaxElements )
{
Stack s=(Stack)malloc(sizeof(struct StackRecord));
s->Array=MaxElements;
s->Top1=-1;
s->Top2= MaxElements;
s->Array=(ElementType *)malloc((MaxElements+1)*sizeof(ElementType));
return s;
}
int IsEmpty( Stack S, int Stacknum )
{
switch(Stacknum)
{
case 1:
S->Top1=S->Capacity;break;
case 2:
S->Top2=-1;break;
default :
return 0;
}
return 1;//succeed
}
int IsFull( Stack S )
{
if(S->Top1 == S->Top2 )return 1;
return 0;
}
int Push( ElementType X, Stack S, int Stacknum )
{
while(int IsFull(S))
{
if(Stacknum==1) S->Array[S->Top1++]
}
return 0;
}