算法导论10.1-2答案

//10.1-2 说明如何用一个数组A[1...n]来实现两个栈,使得两个栈中的元素总数不到n时,两者都不会发生上溢。注意PUSH和POP操作的时间应为O(1)

#include <stdio.h>
#include <stdlib.h>
struct Stack;
typedef struct Stack *St;
#define N 10
struct Stack
{
	int Left_Top;
	int Right_Top;
	int size;
	int *array;
};

St InitStack()
{
	St S;
	S=(St)malloc(sizeof(struct Stack));
	if(!S)
		exit(-1);
	S->size=N;
	S->Left_Top=0;
	S->Right_Top=N;
	S->array=(int*)malloc(sizeof(int)*N);
	return S;
}

void Push(St S,int i,int x)
{
	if(i==0)//i=0表示要在左边入栈
	{
		if(S->Left_Top<S->Right_Top)
		{
			S->Left_Top++;
			S->array[S->Left_Top]=x;
		}
		else
		{
			exit(-1);
		}
	}
	else
	{
		if(S->Left_Top<S->Right_Top)
		{
			S->Right_Top--;
			S->array[S->Right_Top]=x;
		}
		else
		{
			exit(-1);
		}
	}
}

void POP(St S,int i)
{
	if(i==0)//i=0表示将左边的栈中的元素出栈
	{
		if(S->Left_Top+N!=S->Right_Top)
		{
		    S->Left_Top--;
		}
		else
			exit(-1);
	}
	else
	{
		if(S->Left_Top+N!=S->Right_Top)
		{
			S->Right_Top++;
		}
		else
			exit(-1);
	}
}

void Print(St S)
{
	int i;
	for(i=1;i<=S->Left_Top;++i)
		printf("%d ",S->array[i]);
	for(i=S->Right_Top;i<N;i++)
		printf("%d ",S->array[i]);
	printf("\n");
}

void main()
{
	St S;
	S=InitStack();
	Push(S,0,1);
	Push(S,0,2);
	Push(S,0,3);
	Push(S,0,4);
	Push(S,0,5);
	Push(S,1,6);
	Push(S,1,7);
	Print(S);
	POP(S,0);
	POP(S,0);
	POP(S,1);
	POP(S,0);
	Print(S);
}


	

		




	

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值