递归算法颠倒栈中的元素


1. 描述

利用递归颠倒一个栈,例如栈[1, 2, 3, 4, 5], 顺序为从栈底到栈顶。颠倒之后的栈为[5, 4, 3, 2, 1]。


2. 思路

颠倒栈后原先处于栈底的元素现在处于栈顶,如果预先得到初始栈中栈底元素,然后在颠倒剩余的元素之后,把此元素入站,那么就完成了栈的颠倒工作,如图所示:



显然是一个递归的过程,算法递归的调整栈底元素到栈顶。

代码如下:

void inverseStack(Stack *stack)
{
	if (stack->top == 0)
		return;
	bubbleBottom(stack);                    //调整栈底元素到栈顶
	int var = stack->data[--stack->top];	//栈顶元素出栈
	inverseStack(stack);                    //颠倒栈中剩余的元素
	stack->data[stack->top++] = var;        //把出栈的元素压入栈
}


调整栈底元素到栈顶的算法如下:

void bubbleBottom(Stack *stack) //相当于“冒泡”的把栈底元素挪动到栈顶
{
	if (stack->top == 0)
		return;
	int var1 = stack->data[--stack->top];	         //pop
	bubbleBottom(stack);
	int flag = 0, var2;
	if (stack->top > 0)
	{
		var2 = stack->data[--stack->top];
		flag = 1;
	}
	stack->data[stack->top++] = var1;		// push var1
	if (flag)
		stack->data[stack->top++] = var2;	// push var2
}


栈的结构如下:

#define N 20
typedef struct Stack {
	int data[N];
	int top;
}Stack;

测试如下:

#include 

void inverseStack(Stack *stack);
void bubbleBottom(Stack *stack);
int main(void)
{
	int i;
	Stack stack;
	stack.top = 0;
	printf("Now, original stack is:\n");
	printf("\tfrom bottom to top: ");
	for (i = 1; i <= 5; i++) {
		stack.data[stack.top++] = i;
		printf("%d ", i);
	}
	printf("\n");
	inverseStack(&stack);	
	printf("Now, inversed stack is:\n");
	printf("\tfrom top to bottom: ");
	while (stack.top > 0)
		printf("%d ", stack.data[--stack.top]);
	printf("\n");
	return 0;
}

输出:


你可能感兴趣的:(程序设计)