另類堆疊 (20 分)
6-3 另類堆疊 (20 分)
在棧的順序儲存實現中,另有一種方法是將Top定義為棧頂的上一個位置。請編寫程式實現這種定義下堆疊的入棧、出棧操作。如何判斷堆疊為空或者滿?
函式介面定義:
bool Push( Stack S, ElementType X );
ElementType Pop( Stack S );
其中Stack結構定義如下:
typedef int Position;
typedef struct SNode *PtrToSNode;
struct SNode {
ElementType *Data; /* 儲存元素的陣列 */
Position Top; /* 棧頂指標 */
int MaxSize; /* 堆疊最大容量 */
};
typedef PtrToSNode Stack;
注意:如果堆疊已滿,Push函式必須輸出“Stack Full”並且返回false;如果佇列是空的,則Pop函式必須輸出“Stack Empty”,並且返回ERROR。
裁判測試程式樣例:
#include <stdio.h>
#include <stdlib.h>
#define ERROR -1
typedef int ElementType;
typedef enum { push, pop, end } Operation;
typedef enum { false, true } bool;
typedef int Position;
typedef struct SNode *PtrToSNode;
struct SNode {
ElementType *Data; /* 儲存元素的陣列 */
Position Top; /* 棧頂指標 */
int MaxSize; /* 堆疊最大容量 */
};
typedef PtrToSNode Stack;
Stack CreateStack( int MaxSize )
{
Stack S = (Stack)malloc(sizeof(struct SNode));
S->Data = (ElementType *)malloc(MaxSize * sizeof(ElementType));
S->Top = 0;
S->MaxSize = MaxSize;
return S;
}
bool Push( Stack S, ElementType X );
ElementType Pop( Stack S );
Operation GetOp(); /* 裁判實現,細節不表 */
void PrintStack( Stack S ); /* 裁判實現,細節不表 */
int main()
{
ElementType X;
Stack S;
int N, done = 0;
scanf("%d", &N);
S = CreateStack(N);
while ( !done ) {
switch( GetOp() ) {
case push:
scanf("%d", &X);
Push(S, X);
break;
case pop:
X = Pop(S);
if ( X!=ERROR ) printf("%d is out\n", X);
break;
case end:
PrintStack(S);
done = 1;
break;
}
}
return 0;
}
/* 你的程式碼將被嵌在這裡 */
輸入樣例:
4
Pop
Push 5
Push 4
Push 3
Pop
Pop
Push 2
Push 1
Push 0
Push 10
End
輸出樣例:
Stack Empty
3 is out
4 is out
Stack Full
0 1 2 5
程式碼:
bool Push( Stack S, ElementType X )
{
if(S->Top==S->MaxSize)
{
printf("Stack Full\n");
return false;
}
else
{
S->Data[S->Top]=X;
S->Top=S->Top+1;
return true;
}
}
ElementType Pop( Stack S )
{
if(S->Top==0)
{
printf("Stack Empty\n");
return ERROR;
}
else
{
S->Top--;
return S->Data[S->Top];
}
}