导图
课程www.bilibili.com/video/BV1m6…
*(解引用运算符)和&(取地址运算符)
一、栈
1、栈的基本操作
1.1 核心
后进先出
1.2 栈的存储
1.2.1 顺序栈
- 表示
#define MAXSIZE 100
typedef struct{
SElementType *base;//栈底指针
SElmentType *top;//栈顶指针
int stacksize;//栈的大小
}SqStack;
- 进栈
Status Push(SqElementType &S,SElementType e){
if(S.top-S.base==S.size){//先判断栈是否满了
return false;
}
//等价于*S.top++==e;
*S.top==e;
S.top++;
}
- 出栈(获取并移除栈顶的元素)
Status Pop(SqElementType &S,SelmentType &e){
if(S.top==S.base){//先判断栈是否为空
return false;
}
e=*--S.top;//栈顶的元素是top的下一个下标所在的元素
return true;
}
1.2.2 链栈
- 表示
typedef struct StackNode{
SElemtType data;
struct LinkStack *next;
}StackNode,*LinkStack;
LinkStack S;//定义一个指向链栈节点的指针变量S
- 进栈
Status Push(LinkStack &S,SelmentType e){
p=new StackNode;//生成新节点p
if(!p){ return OVERFLOW}//return 返回函数调用结果,exit向操作系统报告退出状态,终止程序
p->data=e;
p->next=S;
p=S;
return true;
}
- 出栈
Satus pop(LinkStack &S,ELement &e){
if(S==NULL){ return false;}
e=S->data;
p=S;
S=S->next;
delete p;
return true;
}
二、队列
1、链队列(带头节点的单链表)
- 表示
typedef struct Qnode{//队列单个元素
QElemType data;
struct Qnode *next;
}Qnode,*QueuePtr;
typedef struct{//队列链式表示
QueuePtr front;//队头指针
QueuePtr rear;//队尾指针
}LinkQueue;
约定带头节点
- 基本操作
入队
Status EnQueue(LinkQueue &Q,QElemType e){
p=new QNode;
if(!p) return OVERFLOW;
p->data=e;
p-next=NULL;
Q.rear->next=p;
Q.rear=p;
return true;
}
出队
2、队列顺序表示(循环队列)
define M 100
typedef struct{
QElementType *base;//用base指针给队列开辟一块连续内存空间
int front;//队头下标
int rear;//队尾下标
}SqQueue;
SqQueue Q;
- 入队
Status EnQueue(SqQueue *Q,QElementType e){
if((Q.rear+1)%M==Q.front) return false;//先判断是否伪满
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%M;
return true;
}
- 出队
Status DeQueue(SqQueue *Q,QElementType &e){
if(Q.front==Q.rear) return false;
e=Q.base[Q.front];
Q.front=(Q.front+1)%M;
return true;
}