用堆栈和用递归分别实现倒序打印
2010-11-04 17:16
295 查看
1.用堆栈实现倒序打印: http://learn.akae.cn/media/ch12s02.html
堆栈是一组元素的集合,类似于数组,不同之处在于,数组可以按下标随机访问,这次访问
[b]例 12.1. 用堆栈实现倒序打印
运行结果是
图 12.1. 用堆栈实现倒序打印
数组
在
用递归实现倒序打印
[/b]
堆栈是一组元素的集合,类似于数组,不同之处在于,数组可以按下标随机访问,这次访问
a[5]下次可以访问
a[1],但是堆栈的访问规则被限制为Push和Pop两种操作,Push(入栈或压栈)向栈顶添加元素,Pop(出栈或弹出)则取出当前栈顶的元素,也就是说,只能访问栈顶元素而不能访问栈中其它元素。如果所有元素的类型相同,堆栈的存储也可以用数组来实现,访问操作可以通过函数接口提供。看以下的示例程序。
[b]例 12.1. 用堆栈实现倒序打印
#include <stdio.h> char stack[512]; int top = 0; void push(char c) { stack[top++] = c; } char pop(void) { return stack[--top]; } int is_empty(void) { return top == 0; } int main(void) { push('a'); push('b'); push('c'); while(!is_empty()) putchar(pop()); putchar('\n'); return 0; }
运行结果是
cba。运行过程图示如下:
图 12.1. 用堆栈实现倒序打印
数组
stack是堆栈的存储空间,变量
top总是保存数组中栈顶的下一个元素的下标,我们说“
top总是指向栈顶的下一个元素”,或者把
top叫做栈顶指针(Pointer)。在第 2 节 “插入排序”中介绍了Loop Invariant的概念,可以用它检验循环的正确性,这里的“
top总是指向栈顶的下一个元素”其实也是一种Invariant,Push和Pop操作总是维持这个条件不变,这种Invariant描述的对象是一个数据结构而不是一个循环,在DbC中称为Class Invariant。Pop操作的语义是取出栈顶元素,但上例的实现其实并没有清除原来的栈顶元素,只是把
top指针移动了一下,原来的栈顶元素仍然存在那里,这就足够了,因为此后通过Push和Pop操作不可能再访问到已经取出的元素,下次Push操作就会覆盖它。
putchar函数的作用是把一个字符打印到屏幕上,和
printf的
%c作用相同。布尔函数
is_empty的作用是防止Pop操作访问越界。这里我们预留了足够大的栈空间(512个元素),其实严格来说Push操作之前也应该检查栈是否满了。
在
main函数中,入栈的顺序是
'a'、
'b'、
'c',而出栈打印的顺序却是
'c'、
'b'、
'a',最后入栈的
'c'最早出来,因此堆栈这种数据结构的特点可以概括为LIFO(Last In First Out,后进先出)。我们也可以写一个递归函数做倒序打印,利用函数调用的栈帧实现后进先出:
用递归实现倒序打印
#include <stdio.h> #define LEN 3 char buf[LEN]={'a', 'b', 'c'}; void print_backward(int pos) { if(pos == LEN) return; print_backward(pos+1); putchar(buf[pos]); } int main(void) { print_backward(0); putchar('\n'); return 0; }
[/b]
相关文章推荐
- 递归实现倒序打印
- 用堆栈实现倒序打印
- 简单的栈的练习---用堆栈实现倒序打印
- 用递归实现倒序打印
- 递归实现倒序打印
- 分别用 循环 和 递归来实现 打印出前 n 个 菲波那切数列
- 递归和非递归分别实现strlen
- 非递归实现二叉树的前序,中序,后序遍历打印
- 实现汉诺塔(Hanoi)问题(堆栈、递归)
- 打印给定一字符串的所有字母组合——递归实现
- linux下用gdb实现程序宕机时自动打印调用堆栈
- 利用递归实现对输入字符串的倒序输出
- Ackerman函数----递归的堆栈实现
- 单向链表的倒序输出(栈实现和递归实现)
- 剑指offer_面试题5_从尾到头打印链表(栈和递归实现)
- 递归实现打印一个数组的所有排列
- 斐波那契堆栈实现(递归的代码实现)
- python之利用堆栈的后进先出的原理实现倒序
- 递归实现链表的正序和倒序输出
- 递归方式实现 1:打印一个整数的每一位 2:实现函数求出n的k次方