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:(其中int Stacknum是堆栈的索引,该索引为1或2;int MaxElements是堆栈数组的大小;堆栈定义如下:)
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.(注意:如果操作可以成功完成,则返回1,如果操作失败,则返回0。如果堆栈为空,Top_Pop必须返回ERROR。)
Sample program of judge:(裁判程序:)
#include <stdio.h>
#include <stdlib.h>
#define ERROR 1e8
typedef int ElementType;
typedef enum { push, pop, end } Operation;
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 */
};
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
代码:
Stack CreateStack(int MaxElements) {
Stack newStack = (Stack)malloc(sizeof(struct StackRecord));
newStack->Capacity = MaxElements;
newStack->Top1 = -1;
newStack->Top2 = MaxElements;
newStack->Array = (int*)malloc((MaxElements) * sizeof(int));
return newStack;
}
int IsEmpty(Stack S, int Stacknum) {
if (Stacknum == 1) {
if (S->Top1 == -1) {
return 1;
}
else {
return 0;
}
}
else if (Stacknum == 2) {
if (S->Top2 == S->Capacity) {
return 1;
}
else {
return 0;
}
}
}
int IsFull(Stack S) {
if (S->Top2-S->Top1 == 1) {
return 1;
}
else {
return 0;
}
}
int Push(ElementType X, Stack S, int Stacknum) {
if (IsFull(S)) {
return 0;
}
else {
if (Stacknum == 1) {
S->Top1++;
S->Array[S->Top1] = X;
}
else if (Stacknum == 2) {
S->Top2--;
S->Array[S->Top2] = X;
}
return 1;
}
}
ElementType Top_Pop(Stack S, int Stacknum) {
int a;
if (IsEmpty(S, Stacknum)) {
return ERROR;
}
else {
if (Stacknum == 1) {
a = S->Top1--; //a保存的是S->Top1的值,然后S->Top1--
return S->Array[a];
}
else if (Stacknum == 2) {
a = S->Top2++;
return S->Array[a];
}
}
}
在样例中,我们输入的数组的大小是5。
本题就是在数组第一个元素的前面(-1)和最后一个元素的后面(5)设置Top1与Top2:
这样入栈的时候,对应的Top移动,如果两个Top相遇,那么栈满。
这道题对于我来说,没做对的地方在pop()函数
弹栈:
ElementType Top_Pop(Stack S, int Stacknum) {
int a;
if (IsEmpty(S, Stacknum)) {
return ERROR;
}
else {
if (Stacknum == 1) {
a = S->Top1--;
return S->Array[a];
}
else if (Stacknum == 2) {
a = S->Top2++;
return S->Array[a];
}
}
}
一开始我是这样写的:
ElementType Top_Pop(Stack S, int Stacknum) {
if (IsEmpty(S, Stacknum)) {
return ERROR;
}
else {
if (Stacknum == 1) {
S->Top1--;
return S->Array[S->Top1--];
}
else if (Stacknum == 2) {
S->Top2++;
return S->Array[S->Top2++];
}
}
}
这样是不对的,因为先执行了S->Top--的话,那么弹出的是栈顶元素的下一个元素。