栈:
概念:
一个装数据的桶,只能从一段进一段出
栈支持哪些操作:
初始化一个栈:init
加入新元素:push
删除元素:pop
获取栈顶元素:getTop
获取一共有多少个元素:getSize
栈的方法指针版:
typedef long long Int;
constexpr Int MAX_SIZE=1000;
//定义一个名为Stack的结构体
struct Stack{
//定义一个名为elem的数组,大小为MAX_SIZE
int elem[MAX_SIZE];
//定义一个名为top的指针,初始化指向elem数组的首地址
int* top = elem;
};
//初始化栈
void init(Stack &s){
*s.top++=x;//尾指针和头指针重合
}
//添加元素
void front(Stack &s, int x){
//先将x放入栈顶,然后top向前一个Int
*s.top++=x;
}
//删除栈顶元素
Int pop(Stack &s){
//先将栈顶元素排出栈然后top后退一格
return *--s.top;
}
//获取栈顶元素
Int getTop(Stack &s){
//返回top(栈顶前面一个int的指针)的前面一个int
return *(s.top-1);
}
//获取栈的大小
Int getSize(Stack &s){
//左闭右开:求元素数量尾指针-头指针
return s.top-s.elem;
}
栈的方法下标版:
typedef long long Int;
// 定义一个常量,MAX_SIZE表示栈的最大容量
constexpr Int MAX_SIZE = 1000;
// 定义一个名为 Stack 的结构体,包含一个整数数组 elem 和一个整数变量 top 用于表示栈顶元素的位置
struct Stack {
// 数组elem存储栈中元素,初始化top为0,表示栈为空
Int elem[MAX_SIZE];
// top为栈顶索引,初始值为0
Int top = 0;
};
// 函数init用于初始化栈,将栈顶元素位置top设置为0
void init(Stack &s) {
// 将栈顶top置为0,表示栈为空
s.top = 0;
}
// 函数pop用于从栈顶删除一个元素并返回该元素的值,top减1
Int pop(Stack &s) {
// 返回栈顶元素elem[top],然后将top减1,表示元素已排出栈
return s.elem[--s.top];
}
// 函数getTop用于获取但不删除栈顶元素的值,直接返回栈顶元素elem[top-1]
Int getTop(Stack &s) {
// 返回栈顶元素的值,不改变栈的状态
return s.elem[s.top - 1];
}
// 函数getSize用于返回栈中元素的数量,但计算方法错误,应为top - s.elem,已修正后的正确版本如下:
// Int getSize(Stack &s) {
// return s.top - s.elem; // 这里应该是返回top - elem,即列表尾减列表头
//}
// 函数push用于将元素x放入栈顶,将新元素放在栈顶位置,并更新top
void push(Stack &s, Int x) {
// 将新元素x存入elem数组的下一位(top+1),然后更新top
s.elem[++s.top] = x;
}
队列:
队列支持哪些操作:
初始化:init
在开头删除一个元素:popFront
在末尾加入一个元素:pushBack
获取开头的元素:getFront
获取末尾的元素:getBack
获取一共有几个元素:getSize
概念:
只能从头上出,从尾上删。
各种方法:
// 定义一个长整型别名,方便后续使用
typedef long long Int;
// 用于限制队列的最大元素数量
constexpr Int MAX_SIZE = 1000;
// 定义一个Queue结构体,包含元素数组elem、头指针head和尾指针tail
struct Queue {
Int elem[MAX_SIZE]; // 存储队列元素的数组
Int* head; // 队列头部指针,初始指向数组第一个元素
Int* tail; // 队列尾部指针,初始指向数组最后一个位置(数组末尾)
};
// 函数pop():将给定值x插入队列尾部,并更新尾指针
// 参数:q(引用)表示操作的队列,x(Int类型)是要入队的值
void pop(Queue& q, Int x) {
// 将新元素x放置在尾部,然后尾部指针后移一位
*q.tail++ = x;
}
// 函数getHead():获取队列头部的元素值,但不移动头部指针
Int getHead(Queue& q) {
// 返回当前头部元素的值,不改变队列状态
return *q.head;
}
// 函数getTail():获取队列尾部的元素值,但不移动尾部指针
Int getTail(Queue& q) {
// 返回当前尾部元素的值,尾部指针减一以排出删除的元素
return *(q.tail - 1);
}
// 函数getSize():计算队列中的元素数量,通过尾部指针和头部指针之差得到
Int getSize(Queue& q) {
// 返回队列中已存储的元素个数头减尾
return q.tail - q.head;
}