数据结构之栈和队列的顺序存储结构

64 阅读3分钟

栈的顺序存储结构

栈的顺序存储结构通常使用一维数组来实现。栈底位于数组的一端(例如,数组的起始位置),栈顶则是一个动态变化的指针,指向数组中的某个位置。

栈的顺序存储结构定义(使用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; // 获取成功
}