【剑指offer】——用两个栈实现队列

题目描述

用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

解答:

typedef struct SQueue{
	Stack stack1;//入队
	Stack stack2;//出队
}SQueue;
 
void QueuePush(SQueue *ps, int data)
{
	Stack *p1, *p2;
	p1 = &(ps->stack1);
	p2 = &(ps->stack2);
	StackPush(p1, data);
	
}
void QueuePop(SQueue *ps)
{
	Stack *p1, *p2;
	p1 = &(ps->stack1);
	p2 = &(ps->stack2);
	int data;
	//栈p2为空的情况下,应先将栈1 的数据弹出到栈2里
	//栈2为非空时,直接将栈2的栈顶元素弹出
	//栈2 的元素总是最先入的
	if (StackisEmpty(p2)){
		while (!StackisEmpty(p1)){
			data = StackTop(p1);
			StackPop(p1);
			StackPush(p2,data);
		}
	}
	StackPop(p2);
}


栈相关代码:

void StackInit(Stack *ps)
{
	assert(ps);
	ps->top = 0;
}
void StackPush(Stack *ps,int data)
{
	assert(ps);
	assert(ps->top < MAXSIZE);
	ps->array[ps->top++] = data;
}
void StackPop(Stack *ps)
{
	assert(ps != NULL);
	assert(ps->top>0);
	ps->top--;
}
//1为空,0为非空
int StackisEmpty(Stack *ps)
{
 
	return ps->top == 0 ? 1 : 0;
}
int StackTop(Stack *ps)
{
	assert(ps);
	assert(ps->top > 0);
	return ps->array[ps->top-1];
}


基本思想:一个栈实现队列的入,一个栈实现队列的出

假设先将元素都压入stack1,如果将stack1中的元素逐个弹出并压入stack2,则元素在stack2中的顺序正好和原来在stack1中的顺序相反,也就是stack2中的栈顶元素就是队列中先入的元素,然后弹出stack2的栈顶元素,就实现了队列的“先入先出”的特点

当stack2不为空时,在stack2中的栈顶元素是最先进如队列的元素,可以弹出;当stack2为空时,需将stack1中的元素全部弹出并压入stack2.

发布了160 篇原创文章 · 获赞 316 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/ShawnWang1994/article/details/99628322
今日推荐