栈和队列 ppt课件
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
特点:
先进后出(FILO)或后进先出(LIFO)
ppt课件
2
... ……...
进栈
出栈
栈
顶
an
栈s=(a1,a2,……,an)
a2
栈底
a1
2. 栈的存储结构
(1) 顺序栈
由于栈是运算受限的线性表,因此线性表的存储结构对栈也适 应。栈的顺序存储结构简称为顺序栈,可用数组来实现顺序栈。
因为栈底位置是固定不变的,所以可以将栈底位置设置在数组
4
顺序存储栈的结点类型的定义:
#define STACK_INIT_SIZE 100; //存储空间初始分配量 #define STACKINCREMENT 10; //存储空间分配增量 typedef struct {
SElemType *base; //栈底指针 SElemType *top; //栈顶指针 int stacksize; //当前已分配的存储空间
3. 栈的应用
回文游戏:顺读与逆读字符串一样(不含空格)
d
top
a
d
字符串:“madam im adam”
1.读入字符串 2.去掉空格(原串) 3.压入栈 4.原串字符与出栈字符依次比较 若不等,非回文
若直到栈空都相等,回文
ppt课件
16
表达式求值(前提规则见教材52、53页)
表达式求值的处理规则
if (!s.base) exit(“失败‘);
s.top=s.base+s.stacksize;
s.stacksize+=STACKINCREMENT; }
*s.top++=e; }
ppt课件
6
顺序栈出栈算法
Status Pop(sqStack &s, SElemType &e) { if ( s.top==s.base) return ERROR;
n=n/8;
}
while(! Stackempty(s)) //判断是否为空栈,见教材46页
{
pop(s,e); //出栈,e为出栈元素
printf(“%d”,e);
}
}
ppt课件
10
[例2:] 假设以I和O分别表示入栈和出栈,栈的初态 和终栈均为空,入栈和出栈的操作序列可表 示为仅由I和O组成的序列,下列所示的序列 中,不合法的是 ( )
A. IOIIOIOO B. IOOIOIIO
C. IIOOIOIO D. IIIOOIOO
ppt课件
11
[例3: ] 一个栈的入栈序列为a,b,c,d,e,则 出栈的不可能序列为( )。
A、e d c b a B、d e c b a C、d c e a b D、a b c d e
ppt课件
12
[例4: ]
栈 栈的应用 队列 队列的应用
ppt课件
1
栈和队列是两种特殊的线性表,是操作受限的线 性表,称限定性DS
§3.1 栈(stack)
1. 栈的定义和特点
定义:
限定仅在表尾进行插入或删除操作的线性表, 通常称插入、删除的这一端,即表尾为栈顶 (Top),另一端表头为栈底 (Base) ,不含元素 的空表称空栈。
的两端的任何一个端点;栈顶位置是随着进栈和退栈操作而变化 的,故需用一个变量top来指示当前栈顶的位置,通常称top为栈 顶指针。
ppt课件
3
顺序栈的存储
top 5 top
4 top
3 top 2 top
1 top
top
base
0 base
栈空
栈满
top
F5
top
E4
top
D3
top
top
C2
top
}sqStack;
ppt课件
5
顺序栈入栈算法
Push( sqStack &s, SElemType e)
{ if (s.top-s.base>=s.stacksize )
{ s.base= (SElemtype*)realloc(s.base,(s.stacksize+ STACKINCREMENT)* sizeof(SElemType ));
栈底
…...
^
结点定义: typedef int datatype; typedef struct node { datatype data;
struct node *link; }JD;
ppt课件
14
入栈算法
top
top
px
出栈算法
q
ቤተ መጻሕፍቲ ባይዱ
top
top
ppt课件
栈底
…...
^
栈底
…...
^
15
“(”,当前运算符为“)”,则脱去括号继续读下一字
符;
4、如当前运算符等于栈顶运算符,且栈顶运算符为
“#”,当前运算符也为“#”,则表达式求值完毕。
设有一顺序栈S,元素s1、s2、s3、s4、 s5、s6依次入栈,如果6个元素出栈的顺 序是s2、s4、s3、s6、s5、s1,则栈的容 量至少应该是( )
A、2 B、3 C、5 D、6
ppt课件
13
2. 栈的存储结构
(2) 链栈
栈顶 top data link
• 链栈无栈满问题,空间可扩充 • 插入与删除仅在栈顶处执行 • 链栈的栈顶在链头 • 适合于多栈操作
--s.top; *e= *s.top; return OK; }
在一个程序中同时使用两个栈
0
M-1
栈1底
栈1顶
栈2顶
栈2底
ppt课件
7
[例1:] 多进制输出:
例 把十进制数159转换成八进制数
8 159 余 7
8 19
余3
82
余2
0
(159)10=(237)8
23 7
top
top 7
top 3 7
读一个字符,如为操作数,直接入到操作数栈;否则即为 运算符,需判断:
1、如当前运算符高于栈顶运算符,入到运算符栈;
2、如当前运算符低于栈顶运算符,栈顶运算符出栈,同时操
作数栈出栈两个数与运算符计算,并将结果入栈;
并输出到队列,当前运算符再与栈顶运算符比较;
3、如当前运算符等于栈顶运算符,且栈顶运算符为
top 2 3
7
ppt课件
8
例1的解法:
n n div 8
159
19
19
2
2
0
n mod 8 7 3 2
ppt课件
9
void conversion( ) { //教材48页
initstack(s); //构造空栈,见教材47页
scanf (“%”,n);
while(n)
{
push(s,n%8); //入栈
B1
top
A0
base
进栈
栈空
F5 E4 D3 C2 B1 A0 出栈
栈顶指针top,指向实 际栈顶后的空位置
设栈的初始容量为Stacksize top=base,栈空,此时出栈则下溢(underflow) top-base>= Stacksize,栈满,此时入栈则上溢(overflow)
ppt课件
先进后出(FILO)或后进先出(LIFO)
ppt课件
2
... ……...
进栈
出栈
栈
顶
an
栈s=(a1,a2,……,an)
a2
栈底
a1
2. 栈的存储结构
(1) 顺序栈
由于栈是运算受限的线性表,因此线性表的存储结构对栈也适 应。栈的顺序存储结构简称为顺序栈,可用数组来实现顺序栈。
因为栈底位置是固定不变的,所以可以将栈底位置设置在数组
4
顺序存储栈的结点类型的定义:
#define STACK_INIT_SIZE 100; //存储空间初始分配量 #define STACKINCREMENT 10; //存储空间分配增量 typedef struct {
SElemType *base; //栈底指针 SElemType *top; //栈顶指针 int stacksize; //当前已分配的存储空间
3. 栈的应用
回文游戏:顺读与逆读字符串一样(不含空格)
d
top
a
d
字符串:“madam im adam”
1.读入字符串 2.去掉空格(原串) 3.压入栈 4.原串字符与出栈字符依次比较 若不等,非回文
若直到栈空都相等,回文
ppt课件
16
表达式求值(前提规则见教材52、53页)
表达式求值的处理规则
if (!s.base) exit(“失败‘);
s.top=s.base+s.stacksize;
s.stacksize+=STACKINCREMENT; }
*s.top++=e; }
ppt课件
6
顺序栈出栈算法
Status Pop(sqStack &s, SElemType &e) { if ( s.top==s.base) return ERROR;
n=n/8;
}
while(! Stackempty(s)) //判断是否为空栈,见教材46页
{
pop(s,e); //出栈,e为出栈元素
printf(“%d”,e);
}
}
ppt课件
10
[例2:] 假设以I和O分别表示入栈和出栈,栈的初态 和终栈均为空,入栈和出栈的操作序列可表 示为仅由I和O组成的序列,下列所示的序列 中,不合法的是 ( )
A. IOIIOIOO B. IOOIOIIO
C. IIOOIOIO D. IIIOOIOO
ppt课件
11
[例3: ] 一个栈的入栈序列为a,b,c,d,e,则 出栈的不可能序列为( )。
A、e d c b a B、d e c b a C、d c e a b D、a b c d e
ppt课件
12
[例4: ]
栈 栈的应用 队列 队列的应用
ppt课件
1
栈和队列是两种特殊的线性表,是操作受限的线 性表,称限定性DS
§3.1 栈(stack)
1. 栈的定义和特点
定义:
限定仅在表尾进行插入或删除操作的线性表, 通常称插入、删除的这一端,即表尾为栈顶 (Top),另一端表头为栈底 (Base) ,不含元素 的空表称空栈。
的两端的任何一个端点;栈顶位置是随着进栈和退栈操作而变化 的,故需用一个变量top来指示当前栈顶的位置,通常称top为栈 顶指针。
ppt课件
3
顺序栈的存储
top 5 top
4 top
3 top 2 top
1 top
top
base
0 base
栈空
栈满
top
F5
top
E4
top
D3
top
top
C2
top
}sqStack;
ppt课件
5
顺序栈入栈算法
Push( sqStack &s, SElemType e)
{ if (s.top-s.base>=s.stacksize )
{ s.base= (SElemtype*)realloc(s.base,(s.stacksize+ STACKINCREMENT)* sizeof(SElemType ));
栈底
…...
^
结点定义: typedef int datatype; typedef struct node { datatype data;
struct node *link; }JD;
ppt课件
14
入栈算法
top
top
px
出栈算法
q
ቤተ መጻሕፍቲ ባይዱ
top
top
ppt课件
栈底
…...
^
栈底
…...
^
15
“(”,当前运算符为“)”,则脱去括号继续读下一字
符;
4、如当前运算符等于栈顶运算符,且栈顶运算符为
“#”,当前运算符也为“#”,则表达式求值完毕。
设有一顺序栈S,元素s1、s2、s3、s4、 s5、s6依次入栈,如果6个元素出栈的顺 序是s2、s4、s3、s6、s5、s1,则栈的容 量至少应该是( )
A、2 B、3 C、5 D、6
ppt课件
13
2. 栈的存储结构
(2) 链栈
栈顶 top data link
• 链栈无栈满问题,空间可扩充 • 插入与删除仅在栈顶处执行 • 链栈的栈顶在链头 • 适合于多栈操作
--s.top; *e= *s.top; return OK; }
在一个程序中同时使用两个栈
0
M-1
栈1底
栈1顶
栈2顶
栈2底
ppt课件
7
[例1:] 多进制输出:
例 把十进制数159转换成八进制数
8 159 余 7
8 19
余3
82
余2
0
(159)10=(237)8
23 7
top
top 7
top 3 7
读一个字符,如为操作数,直接入到操作数栈;否则即为 运算符,需判断:
1、如当前运算符高于栈顶运算符,入到运算符栈;
2、如当前运算符低于栈顶运算符,栈顶运算符出栈,同时操
作数栈出栈两个数与运算符计算,并将结果入栈;
并输出到队列,当前运算符再与栈顶运算符比较;
3、如当前运算符等于栈顶运算符,且栈顶运算符为
top 2 3
7
ppt课件
8
例1的解法:
n n div 8
159
19
19
2
2
0
n mod 8 7 3 2
ppt课件
9
void conversion( ) { //教材48页
initstack(s); //构造空栈,见教材47页
scanf (“%”,n);
while(n)
{
push(s,n%8); //入栈
B1
top
A0
base
进栈
栈空
F5 E4 D3 C2 B1 A0 出栈
栈顶指针top,指向实 际栈顶后的空位置
设栈的初始容量为Stacksize top=base,栈空,此时出栈则下溢(underflow) top-base>= Stacksize,栈满,此时入栈则上溢(overflow)
ppt课件