清华大学计算机程序设计基础_12
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
清华大学 黄维通 设计制作
3
栈的基本操作有: l ClearStack(&S):清空一个栈; l GetTop(S, &e):获取栈顶元素(不删 除该栈顶元素); l Pop(S, &e):获取栈顶元素但同时删 除该元素; l Push(&S, e):向栈顶插入一个元素; l Empty(S):判断是否为空栈的函数。 当S为空栈时,返回true,否则返回false
清华大学 黄维通 设计制作
18
栈的应用--递归编程的应用
常见的阶乘运算的编程,可以引入栈的应用
栈顶元 素为1
fac( int n) { float f; if(n==1||n==0) f=1; else f=n*fac(n-1); return(f); }
清华大学 黄维通 设计制作
例:求10!
n
1!
清华大学 黄维通 设计制作
4
栈的基本操作
Top为栈顶指针,随 着不同操作而移动 top bottom 空栈 增加元素 top bottom
top top bottom
清华大学 黄维通 设计制作
bottom
5
删除元素
12.2 栈的实现
栈是一种特殊的表,因此凡是 可以用来实现表的数据结构都可以 用来实现栈。
清华大学 黄维通 设计制作
15
括号匹配的检验
在编译C语言的源程序时,要对括号进行配对检查,如:
[( [ ] [ ] { } ) ] 1 2 3 4 5 6 7 8 9 10
[ ( [ 1、2、3 4 ] ( [ [ ( [ 5 6 ] ( [ { ( } ( [ 8 9 [ 10 ) ]
[
7
接收1时,就等待第10 ,然而等来的是2,2又等9,…全部配套 后,编译通过,否则出现错误提示。 每读入一个括号,若是右括号,则使栈顶的最急迫的期待 得以消除,若是不合法的情况,如是左括号,则作为一个新的 ,更急迫的期待压入栈中。
第12章 栈及其应用
清华大学 黄维通 设计制作
1
本章主要内容
• 栈的定义及其基本操作 • 栈的实现 • 进制转换--栈的应用实例
清华大学 黄维通 设计制作
2
12.1 栈的定义及其基本操作
栈是一种只允许在栈顶进行插入和删除 操作的线性表,可用数组或线性表来实现
出栈 入栈
栈顶
an a n -1
a1 栈底 a0
清华大学 黄维通 设计制作
16
行编辑程序
简单的行编辑器的 功能是接收用户从终端 输入的程序或者数据并 存入用户的数据区。 用户编辑的特点: • 输入时不能不出错 • 若输入一个字即送入用户数据区,显然 是不恰当的最好是一行输入一次数据区 • 应该允许用户及时修改当前行的错误 假定从终端输入如下的字符: whab##ile(s# *s) outcha@putchar(*s=#++)
•
(8) (n-2) (9) (n-1) (10) n
3 2 1
(n-2)! (n-1)! n!
19
假定 #:退格 @:退行,当前行无效
过程:先判断它是否是退格符或者 退行符,若不是,就将字符压入栈 顶。 若是退格符:从栈顶删除一个字符 若是退行符:将字符栈清为空栈
清华大学 黄维通 设计制作
while(*s) putchar(*s++)
17
接收用户输入的数据,存入用户的数据区 “ #”表示退格符,“ @”表示退行符。 void LineEdit() {InitStack(S); // 构造空栈 ch=getchar(); // 从终端接收一个字符 while(ch!=EOF) // EOF为全文结束符 {while(ch!=EOF && ch!='\n') {switch (ch) {case ‘#’:Pop(S,c); break; //退格,删除栈顶元素 case ‘@’:ClearStack(S); break; //当前行无效 default:Push(S,ch);break; } //插入ch为新的栈顶元素 ch=getchar(); //接收下一个字符 } ClearStack(S);//重置S为空栈,以便重新放入行内容 if(ch!=EOF) ch=getchar(); } DestroyStack(S); //销毁栈,栈不再存在 }
清华大学 黄维通 设计制作
14
void conversion() //进制转换 {Stack s; int dec; ClearStack(&s); scanf("%d",&dec); while( dec > 0) { Push(&s, dec % 2); dec=dec/2;} while(!Empty(s)) { Pop(&s,&dec); printf("%d",dec);} printf("\n"); }
清华大学 黄维通 设计制作
13
void Pop(Stack * s, TYPE * element) //获取栈顶元素但同时删除该元素 {if(Empty(*s) )element = NULL; else { *element = s->element[s->top]; s->top--; } } void Push(Stack * s, TYPE element) //向栈顶插入一个元素 { if(s->top == MAXLENGTH-1) return; else { s->top++; s->element[s->top]=element; } }
清华大学 黄维通 设计制作
9
(3) 获取栈顶元素但同时删除该元素 void Pop(Stack s, TYPE * element) { if (Empty(s)) element = NULL; else { *element = s->element; s = s->next; } }
(4) 向栈顶插入一个元素的操作 void Push(Stack s, TYPE element) { Node * node; node = malloc(sizeof(Node)); node->field = element; node->next = s; s = node; } (5) 判断是否为空栈的操作 int Empty(Stack s) { return (s == NULL); }
清华大学 黄维通 设计制作
6
12.2.1 栈的数组实现
#define MAXLENGTH 256
#define TYPE int struct TStack { int top; TYPE element[MAXLENGTH]; }; typedef struct TStack Stack;
清华大学 黄维通 设计制作
清华大学 黄维通 设计制作
8பைடு நூலகம்
(1) 清空一个栈的操作 void ClearStack(Stack s) { Node * p = s; while(p != NULL) { s = s->next; free(p); s = NULL; }
p = s; }
(2) 获取栈顶元素的操作 void GetTop(Stack s, TYPE * element) { if(Empty(s)) element = NULL; else *element = s->element; }
清华大学 黄维通 设计制作
12
void ClearStack(Stack *s) { s->top = -1; } int Empty(Stack s) { if (s.top == -1) else return 0; }
//清空栈
//判断是否为空栈 return 1;
void GetTop(Stack s, TYPE * element) //获取栈顶元素 { if(Empty(s)) element = NULL; else *element=s.element[s.top]; }
清华大学 黄维通 设计制作
10
12.3进制转换--栈的应用实例
(1) 算法
清华大学 黄维通 设计制作
11
12.3.2 算法的实现
例:(15)10=(1111)2
#include <stdio.h> #include <stdlib.h> #define MAXLENGTH 32 #define TYPE int struct TStack //定义栈结构 { int top; TYPE element[MAXLENGTH]; }; typedef struct TStack Stack;
7
12.2.2 栈的链式存储实现
链式存储栈的类型说明如下: #define TYPE int //定义任意类型的栈结构 struct TNode {TYPE field; //TYPE泛指任意可能的类型 struct TNode * next; }; typedef struct TNode * Stack; //定义一个Stack栈