当前位置: 首页 > news >正文

3-栈、队列、数组

一-栈

1-概念

栈是只允许在一端进行插入或删除操作的线性表
在这里插入图片描述
后进先出(LIFO)

2-顺序存储实现

//定义一个栈
#define MaxSize 10
typedef struct{ElemType data[MaxSize];//栈顶指针int top;
}SqStack;//初始化栈,栈顶指针也可以初始化为0
void InitStack(SqStack &S){S.top=-1;
}//进栈
bool Push(SqStack &S, ElemType x){//栈满if(S.top==MaxSize-1)return false;//元素进栈,等价于S.data[++S.top]=x;S.top = S.top + 1;S.data[S.top]=x;return true;
}//出栈
bool Pop(SqStack &S, ElemType &x){//栈空if(S.top==-1)return false;//栈顶元素先出栈,等价于x=S.data[S.top--];x=S.data[S.top];S.top=S.top-1;return true;
}//读取栈顶元素
bool GetTop(SqStack &S, ElemType &x){if(S.top==-1)return false;x=S.data[S.top];return false;
}void testStack(){SqStack S;InitStack(S);
}

共享栈:两个栈共享同一片内存空间,两个栈从两边往中间增长

//定义
#define MaxSize 10
typedef struct{ElemType data[MaxSize];//0号栈int top0;//1号栈int top1;
}SqStack;//初始化
void InitStack(ShStack &S){S.top=-1;S.top=MaxSize;
}//栈满条件
top0 + 1 == top1

在这里插入图片描述

3-链式存储实现

类似于单链表,单链表有头插法和尾插法,栈的实现是只有头插法。

二-队列

1-概念

只允许在一端进行插入,在另一端删除的线性表
在这里插入图片描述
先进先出(FIFO)

2-顺序实现(循环队列)

//定义
#define MaxSize 10
typedef struct{ElemType data[MaxSize];//队头指针和队尾指针int front,rear;
}SqQueue;//初始化
void InitQueue(SqQueue &Q){Q.rear=Q.front=0;
}void testQueue(){SqQueue Q;InitQueue(Q);
}//入队
bool EnQueue(SqQueue &Q, ElemType x){//判断队满if((Q.rear+1)%MaxSize==Q.front)return false;Q.data[Q.rear]=x;//保证队尾指针在0~MaxSize-1之间循环Q.rear=(Q.rear+1)%MaxSize;return true;
}//出队
bool DeQueue(SqQueue &Q, ELemType &x){//判断队空if(Q.rear==Q.front)return false;x=Q.data[Q.front];Q.front=(Q.front+1)%MaxSize;return true;
}//获得队头元素
bool GetHead(SqQueue Q, ElemType &x){if(Q.rear==Q.front)return false;x=Q.data[Q.front];return true;
}//队列元素个数
(rear + MaxSize - front) % MaxSize

判断队满队空的其它方法
①设置变量size记录队列当前长度

#define MaxSize 10
typedef struct{ElemType data[MaxSize];int front,rear;//记录队列当前长度int size;
}SqQueue;void InitQueue(SqQueue &Q){Q.rear=Q.front=0;Q.size=0;
}void testQueue(){SqQueue Q;InitQueue(Q);
}//入队
bool EnQueue(SqQueue &Q, ElemType x){//判断队满if(Q.size==MaxSize)return false;Q.data[Q.rear]=x;Q.rear=(Q.rear+1)%MaxSize;//插入成功size++Q.size++;return true;
}//出队
bool DeQueue(SqQueue &Q, ElemType &x){//判断队空if(Q.size==0)return false;x=Q.data[Q.front];Q.front=(Q.front+1)%MaxSize;//删除成功Q.size--;return true;
}

②设置变量tag

#define MaxSize 10
typedef struct{ElemType data[MaxSize];int front,rear;//记录最近进行的是删除还是插入int tag;
}SqQueue;void InitQueue(SqQueue &Q){Q.rear=Q.front=0;Q.tag=0;
}void testQueue(){SqQueue Q;InitQueue(Q);
}//入队
bool EnQueue(SqQueue &Q, ElemType x){//判断队满if(Q.front==Q.rear && Q.tag==1)return false;Q.data[Q.rear]=x;Q.rear=(Q.rear+1)%MaxSize;//每次插入操作成功时,都令tag=1Q.tag=1;return true;
}//出队
bool DeQueue(SqQueue &Q, ElemType &x){//判断队空if(Q.front==Q.rear && Q.tag==0)return false;x=Q.data[Q.front];Q.front=(Q.front+1)%MaxSize;//每次删除操作成功时,都令tag=0Q.tag=0;return true;
}

3-链式实现

4-双端队列

三-栈和队列的应用

1-栈在括号匹配中的应用

2-栈在表达式求值中的应用

3-栈在递归中的应用

4-队列的应用

四-数组和特殊矩阵


http://www.mrgr.cn/news/96642.html

相关文章:

  • 《大模型部署》——ollama下载及deepseek本地部署(详细快速部署)
  • 【VM虚拟机ip问题】
  • 类的默认成员函数
  • Vue React
  • Qt基础:信号槽
  • PHP 开发API接口签名验证
  • npm webpack打包缓存 导致css引用地址未更新
  • 分享一个Drools规则引擎微服务Docker部署
  • mysql JSON_ARRAYAGG联合JSON_OBJECT使用查询整合(数组对象)字段
  • RKNN SDK User Guide学习要点
  • 蓝桥杯15届JAVA_A组
  • 【QT5 网络编程示例】TCP 通信
  • Kong网关研究
  • 【Unity】记录TMPro使用过程踩的一些坑
  • Spark,上传文件
  • HTML中数字和字母不换行显示
  • 数据结构和算法(十一)--图
  • 去中心化稳定币机制解析与产品策略建议
  • ros2--xacro
  • Python-八股总结