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

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//定义一个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)
第12章 栈及其应用
可编辑
1
本章主要内容
• 栈的定义及其基本操作 • 栈的实现 • 进制转换--栈的应用实例
可编辑
2
12.1 栈的定义及其基本操作
栈是一种只允许在栈顶进行插入和删除 操作的线性表,可用数组或线性表来实现
出栈
入栈
栈顶
an an-1
a1
栈底
a0
可编辑
3
栈的基本操作有: l ClearStack(&S):清空一个栈; l GetTop(S, &e):获取栈顶元素(不 删除该栈顶元素); Pop(S, &e):获取栈顶元素但同时 删除该元素; Push(&S, e):向栈顶插入一个元素; Empty(S):判断是否为空栈的函数。 当S为空栈时,返回true,否则返回 false
{
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-
可编辑
4
栈的基本操作
空栈
Top为栈顶指针,随 着不同操作而移动
top bottom
top bottom 增加元素
top
bottom
可编辑
删除元素
top bottom
5
12.2 栈的实现
栈是一种特殊的表,因此凡是可 以用来实现表的数据结构都可以用 来实现栈。
可编辑
6
12.2.1 栈的数组实现
#define MAXLENGTH 256
#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;
>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); }
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;}
TYPE element[MAXLENGTH]; }; typedef struct TStack Stack;
可编辑
12
void ClearStack(Stack *s) 栈 { s->top = -1; }
//清空
int Empty(Stack s) 为空栈 { if (s.top == -1)
{if(Empty(*s) )element = NULL; else { *element = s->element[s->top]; s-
>top--; } }
void Push(Stack * s, TYPE element)
//向栈顶插入一个元素
{ if(s->top == MAXLENGTH-1)
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
[]
{}
)
]
((
((
(
[[
[[
[
[
56
78
9
10
接收1时,就等待第10 ,然而等来的是2,2又等9,…全部配 套后,编译通过,否则出现错误提示。
每读入一个括号,若是右括号,则使栈顶的最急迫的期待 得以消除,若是不合法的情况,如是左括号,则作为一个新的 ,更急迫的期待压入栈中。
可编辑
ห้องสมุดไป่ตู้
16
行编辑程序
简单的行编辑器 用户编辑的特点: 的功能是接收用户从终 • 输入时不能不出错 端输入的程序或者数据 • 若输入一个字即送入用户数据区,显 并存入用户的数据区。 然是不恰当的最好是一行输入一次数据
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) //获取栈顶元素但同时删除该元素
可编辑
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;
相关文档
最新文档