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; int MaxElements is the size of the stack array; and Stack is defined as the following:
typedef struct StackRecord *Stack;
struct StackRecord {
int Capacity;
int Top1;
int Top2;
ElementType *Array;
}
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
#include
#define ERROR 1e8
typedef int ElementType;
typedef enum { push, pop, end } Operation;
typedef struct StackRecord *Stack;
struct StackRecord {
int Capacity;
int Top1;
int Top2;
ElementType *Array;
};
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();
void PrintStack( Stack S, int Stacknum );
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;
}
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
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; int MaxElements is the size of the stack array; and Stack is defined as the following:
typedef struct StackRecord *Stack;
struct StackRecord {
int Capacity;
int Top1;
int Top2;
ElementType *Array;
}
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.
#include#include #define ERROR 1e8 typedef int ElementType; typedef enum { push, pop, end } Operation; typedef struct StackRecord *Stack; struct StackRecord { int Capacity; int Top1; int Top2; ElementType *Array; }; 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(); void PrintStack( Stack S, int Stacknum ); 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; }
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
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
Stack 2 is Empty! Stack 1 is Full! Pop from Stack 1: 1 Pop from Stack 2: 13 12 11
结尾无空行
思路用ppt做了张图~感觉题目还是很好懂哒
就是一个数组存放了两个两个数组,一个从头开始(Stack1每插入一个,Top1++),一个从尾开始(Stack2每插入一个,Top1--)
我将Top1初始为0,Top2初始为最后一个位置。如下图:
第二种情况就是存满的情况啦,此时Top1>Top2
答案(AC)Stack CreateStack( int MaxElements ){ Stack S=(Stack)malloc(sizeof(struct StackRecord)); S->Capacity=MaxElements; S->Array=(ElementType*)malloc(sizeof(ElementType)*MaxElements); S->Top1=0; S->Top2=MaxElements-1; return S; } int IsEmpty( Stack S, int Stacknum ){ if(Stacknum==1){ if(S->Top1==0)return 1; }else{ if(S->Top2==S->Capacity-1)return 1; } return 0; } int IsFull( Stack S ){ if(S->Top1>S->Top2)return 1; else return 0; } int Push( ElementType X, Stack S, int Stacknum ){ if(IsFull(S))return 0; if(Stacknum==1){ S->Array[(S->Top1)++]=X; }else{ S->Array[(S->Top2)--]=X; } return 1; } ElementType Top_Pop( Stack S, int Stacknum ){ if(IsEmpty(S,Stacknum))return ERROR; int X; if(Stacknum==1){ X=S->Array[--(S->Top1)]; }else{ X=S->Array[++(S->Top2)]; } return X; }作业都是用C写的哈(其实是我现在只会C)



