文章目录
前言(转载请说明作者!)2020.3.13~3.29
3.13第一次修订
3.28~3.29第二次修订
本博主来自滨州学院信息工程学院2019级软件2班的一名Ordinary Student。
前面在学习日志Ⅰ中了解到,数据结构学习中的一些基本体系与一些结构。
这次的博客来记录一下关于线性表、栈和序列的一些细化知识,包括定义与一些具体的实现过程。
线性表
因需要,线性表的一些内容暂时不做博客叙述,等以后来续。
栈与队列的前言
栈和队列都属于线性表,但属于操作受限的线性表。
栈
限定仅在表尾进行插入和删除操作的线性表
特点:后进先出:Last In First Out(LIFO)
假设模型(药盒)
可以假设栈是一个**药盒**,切面只能存放一枚药片,最多可以存放x粒,只能取出最上面的药片。
假设x=5
药片1==(Top)== |
---|
药片2 |
药片3 |
药片4 |
药片5==(Bottom)== |
底部封死 |
拿出药片的顺序为1->2->3->4->5
药盒:就是个现实意义上面的 “栈”
栈的操作名
名称 | 意义 |
---|---|
栈顶(Top) | 允许进行插入、删除操作的表尾端。(例如药盒里面的***药片1***) |
栈底(Bottom) | 表头端。(例如药盒里面的药片5) |
进栈/入栈(Push) | 栈的插入操作 |
退栈/出栈(Pop) | 栈的删除操作 |
空栈 | 不含元素的空表 |
栈的抽象数据类型
栈的抽象数据类型:逻辑结构+基本运算
类型定义
ADT Stack{
数据对象:
D={ai | ai ∈ ElemSet, i = 1,2,…,n, n>=0}
数据关系:
R1={< ai-1 , ai> | ai-1, ai ∈ D, i=2,…,n}
约定an端为栈顶,a1端为栈底
基本操作:(省略)
}ADT Stack
基本操作方法名
- InitStack(&S)初始化栈,构造一个空栈S
- DestoryStack(&S)销毁栈,释放S占用的存储空间
- StackLength(S)返回栈S的个数,即长度
- StackEmpty(S)判断S是否为空,若为空返回栈,否则返回假
- GetTop(S,&e)取栈S的栈顶元素,用e返回取到的元素
- ClearStack(&s)将S清为空栈
- Push(&S,e)进栈,插入元素e作为新的栈顶元素
- Pop(&S,e)出栈,删除栈S的栈顶元素,用e返回其值
- StackTravers(S,visit())对栈中的元素进行遍历
例题
-
A选项:
(全部先入栈)1.e4(pop) 2.e3(pop) 3.e2(pop) 4.e1(pop);所以A 正确
-
B选项:
1.e1(push) 2.e1(pop) 3.e2(push) 4.e2(pop) 5.e3(push) 6.e3(pop) 7.e4(push) 8.e4(pop);所以B 正确
-
C选项:
1.e1,e2,e3(push) 2.e3(pop) 3.e4(push) 4.e4(pop);剩下的e1,e2只能以e2,e1的顺序出栈,所以C 错误
-
D选项:
1.e1,e2(push) 2.e2(pop) 3.e3,e4(push) 4.e4(push) 5.e3(pop) 6.e1(pop);所以D 正确
答案即为:ABD
顺序栈的实现(仅供参考)
#include<stdio.h>
#include<stdlib.h>
#define MAXLENGTH 100
typedef int Status;
const Status OK=1;
const Status ERROR=0;
typedef int ElemType;
typedef struct{
ElemType data[MAXLENGTH];
int top;
}SqStack;
bool ListEmpty(SqStack st);
Status GetTopElem(SqStack st,ElemType &e);
Status Pop(SqStack &st,ElemType &e);
int main(){
SqStack st;
ElemType input,e;
int i;
printf("请输入若干整数,以0结束:\n");
for(i=0;i<MAXLENGTH;i++){
scanf("%d",&input);
if(input!=0){
st.data[i]=input;
}else{
break;
}
}
st.top=i;
if(GetTopElem(st,e)==OK){
printf("取栈顶元素:%d\n",e);
}else{
printf("无栈顶元素!\n");
}
printf("栈是否为空:");
if(ListEmpty(st)==true){
printf("1\n");
}else{
printf("0\n");
}
printf("栈中元素的个数是:%d\n",st.top);
printf("出栈结果:");
for(;Pop(st,e)==OK;){
printf("%4d",e);
}
printf("\n栈是否为空:");
if(ListEmpty(st)==true){
printf("1\n");
}else{
printf("0\n");
}
printf("栈中元素的个数是:%d\n",st.top);
system("pause");
return 0;
}
bool ListEmpty(SqStack st){
if(st.top==0){
return true;
}
return false;
}
Status GetTopElem(SqStack st,ElemType &e){
if(ListEmpty(st)==true){
return ERROR;
}
e=st.data[st.top-1];
return OK;
}
Status Pop(SqStack &st,ElemType &e){
if(ListEmpty(st)==true){
return ERROR;
}
e=st.data[st.top-1];
st.top--;
return OK;
}
队列
假设模型(过桥)
可以假设队列的出入为过桥,上桥为入队列,下桥为出队列,桥是单向行驶的。
假设三个人入队列:
-
第一步
-
第二步
- 第三步