您的位置:首页 > 其它

算法导论 10.1-2 用一个数组实现两个栈

2012-09-18 18:29 344 查看

一、题目

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

二、思考

分别用数组的两端作为两个栈的起点,向中间扩展,两个栈中的元素总和不超过n时,两个栈不会相遇

三、代码

//用一个数组实现两个栈
struct stack2
{
	//栈1和栈2的栈顶指针
	int top1, top2;//分别初始化为0和n+1
	int len;//数组长度
	int *s;//数组
	stack2(int size):top1(0),top2(size+1),len(size){s = new int[size+1];}
};
//分别输出两个栈,从栈底到栈顶
void Print(stack2 S)
{
	int i;
	cout<<"stack1:";
	for(i = 1; i <= S.top1; i++)
		cout<<S.s[i]<<' ';
	cout<<endl;
	cout<<"stack2:";
	for(i = S.len; i >= S.top2; i--)
		cout<<S.s[i]<<' ';
	cout<<endl;
}
//判断栈是否为空,flag为0表示对第1个栈进行操作,flag为1表示对第2个栈进行操作
bool Stack2_Empty(stack2 &S, bool flag)
{
	if(flag == 0 && S.top1 < 1)
		return 1;
	if(flag == 1 && S.top2 > S.len)
		return 1;
	return 0;
}
//入栈,flag为0表示对第1个栈进行操作,flag为1表示对第2个栈进行操作
void Push(stack2& S, int value, bool flag)
{
	//已满
	if(S.top1 > S.top2)
	{
		cout<<"error:overflow"<<endl;
		return;
	}
	//对栈1操作
	if(flag == 0)
	{
		//top
		S.top1++;
		S.s[S.top1] = value;
	}
	//对栈2操作
	else
	{
		S.top2--;
		S.s[S.top2] = value;
	}
}
//出栈,flag为0表示对第1个栈进行操作,flag为1表示对第2个栈进行操作
int Pop(stack2 &S, bool flag)
{
	int ret;
	//对栈1操作
	if(flag == 0)
	{
		//栈1为空
		if(S.top1 < 0)
		{
			cout<<"error:underflow"<<endl;
			return -1;
		}
		else
		{
			ret = S.s[S.top1];
			S.top1--;
		}
	}
	//对栈2操作
	else
	{
		//栈2为空
		if(S.top2 > S.len)
		{
			cout<<"error:underflow"<<endl;
			return -1;
		}
		else
		{
			ret = S.s[S.top2];
			S.top2++;
		}
	}
	return ret;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐