数据结构——一个数组实现两个堆栈

        只用一个数组实现两个堆栈,这是很有意思的问题。首先我们得确定栈顶,很容易想到将数组底部与数组尾部分别作为两个栈顶。然后压栈、出栈的原理是一样的,可以参考我上一篇博客。下面我说一下要注意的地方:

1、如何判断栈满?

栈满的判断可以根据两个栈顶之间的距离来判断,当栈满时必然存在top2-top1 == 1。

int ISFull(Stack S)
{
    return S->Top2 - S->Top1 == 1;

2、从数组顶端压栈,栈顶是减1;从数组底部压栈,栈顶是加1;

3、从数组顶端出栈,栈顶是加1;从数组底部出栈,栈顶是减1;

C语言实现:

#include <stdio.h> 
#include <stdlib.h>

typedef struct SNode *Stack;
struct SNode{
	int *Data;
	int Top1;
	int Top2;
	int MAXSIZE;
};

Stack Create_Two_Stack(int MaxSize);
int ISFull(Stack S);
int IS1Empty(Stack S);
int IS2Empty(Stack S);
int Push(Stack S, int X, int Tag);
int Pop(Stack S, int Tag);

int main()
{
	Stack S;
	int MaxSize;
	int i;
	scanf("%d",&MaxSize);
	S = Create_Two_Stack(MaxSize);
	for(i=1;!ISFull(S);i++)
	{
		Push(S,i,1);
		Push(S,i,2);
	}
	printf("栈1:\n");
	for( ; !IS1Empty(S); ) 
		printf("%d",Pop(S,1));
	printf("\n栈2:\n");
	for( ; !IS2Empty(S); ) 
		printf("%d",Pop(S,2));
	
	return 0;
}

/* 
**	创建两个空栈 
*/ 
Stack Create_Two_Stack(int MaxSize)
{
	Stack S = (Stack)malloc(sizeof(struct SNode));
	S->Data = (int *)malloc(MaxSize*sizeof(int));
	S->Top1 = -1;				/* 栈1栈顶在数组底部-1 */ 
	S->Top2 = MaxSize;			/* 栈2栈顶在数组顶部MaxSize */ 
	S->MAXSIZE = MaxSize;
}

/*
**	判断栈满
*/
int ISFull(Stack S)
{
	return S->Top2 - S->Top1 == 1;
} 

/*	
**	判断栈1空
*/
int IS1Empty(Stack S)
{
	return	S->Top1 == -1;  
} 

/*	
**	判断栈2空
*/
int IS2Empty(Stack S)
{
	return	S->Top2 == S->MAXSIZE;  
} 

/*
**	压栈
*/ 
int Push(Stack S, int X, int Tag)
{
	if(ISFull(S))
		return 0;
	else{
		if(Tag == 1)
			S->Data[++(S->Top1)] = X;
		else
			S->Data[--(S->Top2)] = X;
		return 1;
	}
}

/* 
**	出栈
*/
int Pop(Stack S, int Tag)
{
	if(Tag == 1){
		if(IS1Empty(S))
		{
			printf("栈1空\n");
			exit(1);
		}
		else{
			return S->Data[(S->Top1)--];
		}
	}
	else{
		if(IS2Empty(S))
		{
			printf("栈2空\n");
			exit(1);
		}
		else{
			return S->Data[(S->Top2)++];
		}
	}
} 

猜你喜欢

转载自blog.csdn.net/Bridge3/article/details/82561357