栈的顺序存储结构
栈的顺序存储结构通常使用一维数组来实现。栈底位于数组的一端(例如,数组的起始位置),栈顶则是一个动态变化的指针,指向数组中的某个位置。
栈的顺序存储结构定义(使用C语言):
#define MAXSIZE 100 // 定义栈的最大容量
typedef struct {
int data[MAXSIZE]; // 栈的存储空间
int top; // 栈顶指针,初始化为-1
} SqStack;
基本操作:
1、初始化栈:将栈顶指针 top 初始化为 -1,表示栈为空。
void InitStack(SqStack *S) {
S->top = -1;
}
2、判断栈是否为空:如果 top 等于 -1,则栈为空。
int StackEmpty(SqStack S) {
return S.top == -1;
}
3、入栈:如果栈未满,将元素压入栈顶,并将 top 加一。
int Push(SqStack *S, int e) {
if (S->top == MAXSIZE - 1) { // 栈满
return 0; // 入栈失败
}
S->data[++S->top] = e; // 先移动指针,再添加元素
return 1; // 入栈成功
}
4、出栈:如果栈非空,将栈顶元素弹出,并将 top 减一。
int Pop(SqStack *S, int *e) {
if (S->top == -1) { // 栈空
return 0; // 出栈失败
}
*e = S->data[S->top--]; // 先获取元素,再移动指针
return 1; // 出栈成功
}
5、取栈顶元素:如果栈非空,返回栈顶元素,但不改变栈的状态。
int GetTop(SqStack S, int *e) {
if (S.top == -1) { // 栈空
return 0; // 获取失败
}
*e = S.data[S.top];
return 1; // 获取成功
}
队列的顺序存储结构
队列的顺序存储结构可以使用一维数组和两个指针来实现,一个指向队头(front),另一个指向队尾(rear)。为了处理队列的入队和出队操作,通常有两种实现方式:循环队列和链式队列。这里只讨论循环队列的顺序存储结构。
队列的顺序存储结构定义(使用C语言):
#define MAXSIZE 100 // 定义队列的最大容量
typedef struct {
int data[MAXSIZE]; // 队列的存储空间
int front; // 队头指针
int rear; // 队尾指针
} SqQueue;
基本操作(循环队列):
1、初始化队列:将 front 和 rear 都初始化为 0。
void InitQueue(SqQueue *Q) {
Q->front = Q->rear = 0;
}
2、判断队列是否为空:如果 front 等于 rear,则队列为空。
int QueueEmpty(SqQueue Q) {
return Q.front == Q.rear;
}
3、入队:如果队列未满((rear + 1) % MAXSIZE != front),则在队尾插入元素,并更新 rear。
int EnQueue(SqQueue *Q, int e) {
if ((Q->rear + 1) % MAXSIZE == Q->front) { // 队列满
return 0; // 入队失败
}
Q->data[Q->rear] = e; // 插入元素
Q->rear = (Q->rear + 1) % MAXSIZE; // 更新队尾指针
return 1; // 入队成功
}
4、出队:如果队列非空(front 不等于 rear),则移除队头元素,并更新 front。
int DeQueue(SqQueue *Q, int *e) {
if (Q->front == Q->rear) { // 队列空
return 0; // 出队失败
}
*e = Q->data[Q->front]; // 取出元素
Q->front = (Q->front + 1) % MAXSIZE; // 更新队头指针
return 1; // 出队成功
}
5、取队头元素:如果队列非空,返回队头元素,但不改变队列的状态。
int GetFront(SqQueue Q, int *e) {
if (Q.front == Q.rear) { // 队列空
return 0; // 获取失败
}
*e = Q.data[Q.front];
return 1; // 获取成功
}