数据结构算法-顺序表、栈和队列-顺序栈的出栈和入栈(适用考研408)

   一、栈的基本概念

        栈是限定仅在表尾进行插入和删除操作的线性表,是特殊的线性表

        栈顶(top)是允许插入和删除的一端,栈底(bottom)则是另一端        

        空栈:不含任何数据元素的栈

  • 栈又称为后进先出的线性表(Last In First Out)简称LIFO结构

        栈是一个线性表,具有线性关系,即前驱后继关系,在表尾中进行插入和删除操作时,这个            表尾指的是栈顶

  • 栈的插入(push):叫作进栈、压栈、入栈

        栈的删除(pop):叫作出栈、弹栈

空栈、进栈、出栈示意图

二、栈的结构定义

data 数组用于存储栈中的元素,而 top 则用于指示栈顶元素的位置。

在使用这个顺序栈时,可以进行入栈和出栈等操作,同时需要注意栈的大小不能超过 MAXSIZE

typedef int SElemType       //假设SElemType的类型为int

//顺序栈结构

typedef struct

{

SElemType data[MAXSIZE];

int top;         //用于栈顶指针

}SqStack;

三、进栈操作

 用push函数,作用是将新元素插入到顺序栈的栈顶,如果栈已满则插入失败。

步骤:

  1. if (S->top == MAXSIZE - 1):这个条件判断用于检查栈是否已满。如果栈顶指针 top 等于 MAXSIZE - 1,说明栈已满,无法再插入新元素,此时返回 ERROR 表示插入失败。

  2. S->top++:栈顶指针加一,表示新元素将插入到栈顶位置。

  3. S->data[S->top] = *e:将新插入的元素值 e 赋值给栈顶空间。

  4. return OK:返回 OK 表示插入操作成功。

// 插入元素为 e 的新栈顶元素
Status Push(SqStack *S, SElemType *e) {
    // 判断栈是否已满
    if (S->top == MAXSIZE - 1) {
        return ERROR; // 栈满,插入失败
    }

    S->top++;          // 栈顶指针加一
    S->data[S->top] = *e; // 将新插入元素赋值给栈顶空间
    return OK;         // 插入成功
}

 四、出栈操作

用pop函数,作用是删除顺序栈的栈顶元素,如果栈为空则删除失败。

步骤:

  1. if (S->top == -1):这个条件判断用于检查栈是否为空。如果栈顶指针 top 等于 -1,说明栈为空,无法执行删除操作,此时返回 ERROR 表示删除失败。

  2. *e = S->data[S->top]:将要删除的栈顶元素的值赋值给 e,用于返回被删除元素的值。

  3. S->top--:栈顶指针减一,表示删除栈顶元素。

  4. return OK:返回 OK 表示删除操作成功。

// 若栈不空,将删除 S 的栈顶元素,用 e 返回其值,并返回 OK;否则返回 ERROR
Status Pop(SqStack *S, SElemType *e) {
    if (S->top == -1)
        return ERROR; // 栈空,删除失败

    *e = S->data[S->top];  // 将要删除的栈顶元素赋值给 e
    S->top--;              // 栈顶指针减一
    return OK;             // 删除成功
}

 五、根据图示写出进栈出栈的完整代码

文字描述:

        1.空栈

        2.A进栈

        3.B进栈

        4.C进栈

        5.C出栈

        6.B出栈

代码:

#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 5  // 定义栈的最大大小

typedef char SElemType;  // 栈中元素类型为字符

typedef struct {
    SElemType data[MAXSIZE];
    int top;  // 栈顶指针
} SqStack;

typedef enum {
    OK,
    ERROR,
} Status;

// 初始化栈
Status InitStack(SqStack *S) {
    S->top = -1;  // 空栈时栈顶指针置为-1
    return OK;
}

// 进栈操作
Status Push(SqStack *S, SElemType e) {
    if (S->top == MAXSIZE - 1) {
        return ERROR;  // 栈满,插入失败
    }
    S->top++;
    S->data[S->top] = e;
    return OK;
}

// 出栈操作
Status Pop(SqStack *S, SElemType *e) {
    if (S->top == -1) {
        return ERROR;  // 栈空,删除失败
    }
    *e = S->data[S->top];
    S->top--;
    return OK;
}

int main() {
    SqStack stack;
    SElemType e;

    // 第一步:初始化栈为空栈
    InitStack(&stack);

    // 第二步:A 进栈
    Push(&stack, 'A');

    // 第三步:插入元素 B 进栈
    Push(&stack, 'B');

    // 第四步:C 进栈
    Push(&stack, 'C');

    // 打印当前栈内容
    printf("Current stack: ");
    for (int i = 0; i <= stack.top; i++) {
        printf("%c ", stack.data[i]);
    }
    printf("\n");

    // 第五步:C 出栈
    Pop(&stack, &e);
    printf("Pop element: %c\n", e);

    // 打印当前栈内容
    printf("Current stack: ");
    for (int i = 0; i <= stack.top; i++) {
        printf("%c ", stack.data[i]);
    }
    printf("\n");

    // 第六步:B 出栈
    Pop(&stack, &e);
    printf("Pop element: %c\n", e);

    // 打印当前栈内容
    printf("Current stack: ");
    for (int i = 0; i <= stack.top; i++) {
        printf("%c ", stack.data[i]);
    }
    printf("\n");

    return 0;
}

  • 13
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值