java中一个数组实现两个栈_在一个数组中实现两个堆栈

该博客介绍如何在C语言中利用一个数组实现两个堆栈,提供了创建堆栈、压入元素和弹出元素的函数实现。当堆栈满或空时,函数会进行相应的错误处理。文章包括了裁判测试程序和样例输入输出,展示了如何在实际场景中应用这种数据结构。
摘要由CSDN通过智能技术生成

6-7 在一个数组中实现两个堆栈(20 分)

本题要求在一个数组中实现两个堆栈。

函数接口定义:

Stack CreateStack( int MaxSize );

bool Push( Stack S, ElementType X, int Tag );

ElementType Pop( Stack S, int Tag );

其中Tag是堆栈编号,取1或2;MaxSize堆栈数组的规模;Stack结构定义如下:

typedef int Position;

struct SNode {

ElementType *Data;

Position Top1, Top2;

int MaxSize;

};

typedef struct SNode *Stack;

注意:如果堆栈已满,Push函数必须输出“Stack Full”并且返回false;如果某堆栈是空的,则Pop函数必须输出“Stack Tag Empty”(其中Tag是该堆栈的编号),并且返回ERROR。

裁判测试程序样例:

#include

#include

#define ERROR 1e8

typedef int ElementType;

typedef enum { push, pop, end } Operation;

typedef enum { false, true } bool;

typedef int Position;

struct SNode {

ElementType *Data;

Position Top1, Top2;

int MaxSize;

};

typedef struct SNode *Stack;

Stack CreateStack( int MaxSize );

bool Push( Stack S, ElementType X, int Tag );

ElementType Pop( Stack S, int Tag );

Operation GetOp(); /* details omitted */

void PrintStack( Stack S, int Tag ); /* details omitted */

int main()

{

int N, Tag, X;

Stack S;

int done = 0;

scanf("%d", &N);

S = CreateStack(N);

while ( !done ) {

switch( GetOp() ) {

case push:

scanf("%d %d", &Tag, &X);

if (!Push(S, X, Tag)) printf("Stack %d is Full!\n", Tag);

break;

case pop:

scanf("%d", &Tag);

X = Pop(S, Tag);

if ( X==ERROR ) printf("Stack %d is Empty!\n", Tag);

break;

case end:

PrintStack(S, 1);

PrintStack(S, 2);

done = 1;

break;

}

}

return 0;

}

/* 你的代码将被嵌在这里 */

输入样例:

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 2 Empty

Stack 2 is Empty!

Stack Full

Stack 1 is Full!

Pop from Stack 1: 1

Pop from Stack 2: 13 12 11

ANS:

Stack CreateStack( int MaxSize )

{

Stack s = (Stack )malloc(sizeof(struct SNode));

s->MaxSize=MaxSize;

s->Data=(ElementType *)malloc(MaxSize*sizeof(ElementType));

s->Top1=-1;

s->Top2=MaxSize;

return s;

}

bool Push( Stack S, ElementType X, int Tag )

{

if(S->Top2-S->Top1==1)

{

printf("Stack Full\n");

return 0;

}

if(Tag==1)

{

S->Data[++(S->Top1)]=X;

}

else

{

S->Data[--(S->Top2)]=X;

}

return 1;

}

ElementType Pop( Stack S, int Tag )

{

if(S->Top1==-1&&Tag==1)

{

printf("Stack %d Empty\n",Tag);

return ERROR;

}

if(S->Top2==S->MaxSize&&Tag==2)

{

printf("Stack %d Empty\n",Tag);

return ERROR;

}

return Tag==1?S->Data[(S->Top1)--]:S->Data[(S->Top2)++];

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值