清华大学计算机程序设计基础-12

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

{
if(Empty(s)) element = NULL;
else *element = s->element;
}
可编辑
9
(3) 获取栈顶元素但同时删除该元素
void Pop(Stack s, TYPE * element)
{ if (Empty(s)) element = NULL;
else { *element = s->element; s = s-
栈是一种只允许在栈顶进行插入和删除 操作的线性表,可用数组或线性表来实现
出栈
入栈
栈顶
an an-1
a1
栈底
a0
可编辑
3
栈的基本操作有: l ClearStack(&S):清空一个栈; l GetTop(S, &e):获取栈顶元素(不 删除该栈顶元素); Pop(S, &e):获取栈顶元素但同时 删除该元素; Push(&S, e):向栈顶插入一个元素; Empty(S):判断是否为空栈的函数。 当S为空栈时,返回true,否则返回 false
>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); }
{if(Empty(*s) )element = NULL; else { *element = s->element[s->top]; s-
>top--; } }
void Push(Stack * s, TYPE element)
//向栈顶插入一个元素
{ if(s->top == MAXLENGTH-1)
//定义一个Stack栈
可编辑
8
(1) 清空一个栈的操作 void ClearStack(Stack s) { Node * p = s;
while(p != NULL) { s = s->next; free(p); p = s; }
s = NULL; }
(2) 获取栈顶元素的操作
void GetTop(Stack s, TYPE * element)
将字符栈清为空栈简单的行编辑器的功能是接收用户从终端输入的程序或者数据并存入用户的数据可编辑18接收用户输入的数据存入用户的数据区表示退格符表示退行符
第12章 栈及其应用
可编辑
1
本章主要内容
• 栈的定义及其基本操作 • 栈的实现 • 进制转换--栈的应用实例
可编辑
2
12.1 栈的定义及其基本操作
例:求10! n
if(n==1||n==0)
f=1;
•elLeabharlann ef=n*fac(n-1);
(8) (n-2)
3
return(f);
}
(9) (n-1)
2
(10) n
1
可编辑
1!
(n-2)! (n-1)! n!
19
putchar(*s++)
可编辑
17
接收用户输入的数据,存入用户的数据区
“ #”表示退格符,“ @”表示退行符。
void LineEdit()
{InitStack(S);
// 构造空栈
ch=getchar();
// 从终端接收一个字符
while(ch!=EOF) // EOF为全文结束符
{while(ch!=EOF && ch!='\n')
{switch (ch)
顶{c元as素e ‘#’:Pop(S,c); break; //退格,删除栈
case ‘@’:ClearStack(S); break; //当前行无效
元d素efault:Push(S,ch);break; } //插入ch为新的栈顶
ch=getchar();
//接收下一个字符
while(!Empty(s))
{ Pop(&s,&dec);
printf("%d",dec);}
printf("\n");
}
可编辑
15
括号匹配的检验
在编译C语言的源程序时,要对括号进行配对检查,如:
[( [ ] [ ] { } ) ] 1 2 3 4 5 6 7 8 9 10
[
]
(
[
1、2、3 4
TYPE element[MAXLENGTH]; }; typedef struct TStack Stack;
可编辑
12
void ClearStack(Stack *s) 栈 { s->top = -1; }
//清空
int Empty(Stack s) 为空栈 { if (s.top == -1)
return;
else
{ s->top++;
s->element[s->top]=element;
} 可编辑
14
void conversion()
//进制转换
{Stack s;
int dec;
ClearStack(&s);
scanf("%d",&dec);
while( dec > 0)
{ Push(&s, dec % 2); dec=dec/2;}
else return 0; }
//判断是否 return 1;
void GetTop(Stack s, TYPE * element) //获取栈顶元素
{ if(Empty(s)) element = NULL; else可编*辑element=s.element[s.top]; 13
void Pop(Stack * s, TYPE * element) //获取栈顶元素但同时删除该元素
可编辑
4
栈的基本操作
空栈
Top为栈顶指针,随 着不同操作而移动
top bottom
top bottom 增加元素
top
bottom
可编辑
删除元素
top bottom
5
12.2 栈的实现
栈是一种特殊的表,因此凡是可 以用来实现表的数据结构都可以用 来实现栈。
可编辑
6
12.2.1 栈的数组实现
#define MAXLENGTH 256
区 • 应该允许用户及时修改当前行的错误 假定 #:退格 @:退行,当前行无效 假定从终端输入如下的字符:
过程:先判断它是否是退格符或者 whab##ile(s# *s) 退行符,若不是,就将字符压入栈 outcha@putchar(*s=#++) 顶。 若是退格符:从栈顶删除一个字符 若是退行符:将字符栈清为空栈 while(*s)
可编辑
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;
[]
{}
)
]
((
((
(
[[
[[
[
[
56
78
9
10
接收1时,就等待第10 ,然而等来的是2,2又等9,…全部配 套后,编译通过,否则出现错误提示。
每读入一个括号,若是右括号,则使栈顶的最急迫的期待 得以消除,若是不合法的情况,如是左括号,则作为一个新的 ,更急迫的期待压入栈中。
可编辑
16
行编辑程序
简单的行编辑器 用户编辑的特点: 的功能是接收用户从终 • 输入时不能不出错 端输入的程序或者数据 • 若输入一个字即送入用户数据区,显 并存入用户的数据区。 然是不恰当的最好是一行输入一次数据
}
ClearStack(S);//重置S为空栈,以便重新放入行内容
if(ch!=EOF) ch=getchar();
}
DestroyS可ta编c辑k(S);
//销毁栈,栈不再存在18
栈的应用--递归编程的应用
常见的阶乘运算的编程,可以引入栈的应用
栈顶元 素为1
fac( int n) { float f;
#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;
相关文档
最新文档