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

函数接口定义:

   

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 <stdio.h>
    #include <stdlib.h>
     
    #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

正确代码:(PTA通过)

/*THE ANSWER IS:*/

Stack CreateStack( int MaxSize )
{
	Stack S;
	S=(Stack)malloc(sizeof(struct SNode));
	S->MaxSize=MaxSize;
	S->Top1=-1;
	S->Top2=S->MaxSize;
	S->Data=(ElementType *)malloc(S->MaxSize*sizeof(ElementType));
	return S; 
}
bool Push( Stack S, ElementType X, int Tag )
{
	if(Tag==1)
	{
		if(S->Top1+1==S->Top2)/*如果栈满*/ 
		{
			printf("Stack Full");
			return false;
		}else{
			S->Data [++(S->Top1)]=X;
			return true;
		} 
	}else if(Tag==2)
	{
		if(S->Top1+1==S->Top2)/*如果栈满*/ 
		{
			printf("Stack Full");
			return false;
		}else{
			S->Data [--(S->Top2)]=X;
			return true;
		} 
	}
}
ElementType Pop( Stack S, int Tag )
{
	if(Tag==1)
	{
		if(S->Top1==-1)/*栈空*/ 
		{
			printf("Stack %d Empty",Tag);
			return ERROR; 
		}else{
			
			return S->Data[(S->Top1)--];
		}
	}else if(Tag==2)
	{
		if(S->Top2==S->MaxSize)
		{
			printf("Stack %d Empty",Tag);
			return ERROR;
		}else{
			
			return S->Data[(S->Top2)++];
		}
	}
}

SOME TIPS:

①:要注意题目要求,不要急于code。格式上的要求(printf("          \n")),看清输出语句是让你写的还是程序自动执行的,

返回要求,明确要求返回false /ERROR.  (ps:以后不要在这样的问题shang浪费时间!)

②:判断栈空的条件:栈1空》》S->Tag1==-1;栈2空》》S->Tag2==MaxSize

判断栈满的条件:S->Tag1+1==S->Tag2

③:ElementType Pop( Stack S, int Tag )函数返回格式为ElementType,所以请眉毛下边的两位认真一些,谢谢!

④:关于creat栈,其中和课堂上学的基本操作不一样的就是这里的结构体中没有直接就打包数组like 》elementype num[maxsize],而是给了一个指针,和一个maxsize,所以这里稍微转一下脑子,creat的时候这个数组是需要你自己malloc的,like》S->Data=(ElementType *)malloc(S->MaxSize*sizeof(ElementType));

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值