顺序栈的入栈函数

顺序栈的知识:

参考视频

46:31-1:01:06这部分讲了栈的概念,顺序表的初始化,出栈,入栈,获取栈顶元素

https://www.bilibili.com/video/BV1tNpbekEht?t=2790.6&p=5

笔记:

栈和队列栈:只能在表尾进行插入或删除操作的线性表

  • 栈顶:表尾部(操作的一端)
  • 栈底:表头部(固定的一端)
  • 空栈:不含元素的空表
  • 栈的特性:先进后出 / 后进先出
  • 栈的操作:进栈(插入元素)、出栈(删除最后插入的元素)栈的顺序结构实现:
  • 栈的顺序结构基于数组实现(栈顶指针对应数组下标)
  • 栈声明时已预先开辟数组空间,无需动态初始化
1. 基础定义(宏、类型、结构体)
复制代码
// 栈的最大容量
#define MAXSIZE 100
// 栈存储的数据类型
typedef int ElemType;
// 顺序栈的结构体定义
typedef struct {
    ElemType data[MAXSIZE];
    int top; // 栈顶指针(取值范围:-1 ~ MAXSIZE-1)
} Stack;
2. 栈的初始化函数
复制代码
// 初始化栈:将栈顶指针设为-1(表示空栈)
void initStack(Stack *s)
{
    s->top = -1;
}
3. 判断栈是否为空
复制代码
// 判断栈是否为空:空栈返回1,非空返回0
int isEmpty(Stack *s)
{
    if (s->top == -1)
    {
        printf("空的\n");
        return 1;
    }
    else
    {
        return 0;
    }
}
4. 进栈(压栈)函数
复制代码
// 进栈:将元素e压入栈,成功返回1,栈满返回0
int push(Stack *s, ElemType e)
{
    // 判断栈是否已满
    if (s->top >= MAXSIZE - 1)
    {
        printf("满了\n");
        return 0;
    }
    // 栈顶指针上移,存入元素
    s->top++;
    s->data[s->top] = e;
    return 1;
}
5. 出栈函数
复制代码
// 出栈:取出栈顶元素存入*e,成功返回1,空栈返回0
int pop(Stack *s, ElemType *e)
{
    // 判断栈是否为空
    if (s->top == -1)
    {
        printf("空的\n");
        return 0;
    }
    // 取出栈顶元素,栈顶指针下移
    *e = s->data[s->top];
    s->top--;
    return 1;
}
6. 获取栈顶元素函数
复制代码
// 获取栈顶元素:将栈顶元素存入*e,成功返回1,空栈返回0
int getTop(Stack *s, ElemType *e)
{
    // 判断栈是否为空
    if (s->top == -1)
    {
        printf("空的\n");
        return 0;
    }
    // 取出栈顶元素(不移动栈顶指针)
    *e = s->data[s->top];
    return 1;
}

手写笔记:

题目:

复制代码
#include <stdio.h>
#include <malloc.h>
#include <string.h>

#define STACKSIZE 100                // 宏定义,设栈最大容量为100
typedef char DataType;                // 数据类型

/****** 顺序栈 ******/
typedef struct                        // 顺序栈定义
{
    DataType items[STACKSIZE];            
    int top;                        // top表示栈顶指针,取值范围-1---STACKSIZE-1
}SqStack;  

/* 【 本题要求函数-入栈 】*/
int Push (SqStack * S, DataType e);        
/*S为指向顺序栈的指针,e为待入栈的数据元素*/

/****** 顺序栈初始化 ******/
void Initstack(SqStack *stack)      // stack为指向顺序栈的指针
{
    stack->top = -1;
}

//出栈
int Pop (SqStack * S, DataType *e)       /*S指向顺序栈指针,e出栈元素*/   
{
    if( S->top <= -1)         /*栈为空*/
         return 0;
       *e= S->items[S->top];     /*将栈顶元素带回来*/
       S->top--;      /* 修改栈顶指针 */
       return 1;
}

/****** 主函数 ******/
int main()
{
    int i;                        
    SqStack stack;            // 顺序栈
    DataType ch;

    Initstack(&stack);
    for(i=0;i<STACKSIZE;i++)
    {
        ch = getchar();
        if(ch=='\n')
            break;
        if(!Push(&stack,ch))
            break;
    }

    if(Pop(&stack,&ch))
        printf("%c",ch);
        return 0;
}

/* 请在这里填写答案 */

思路:

1.先判断栈满了吗?

2.再进行入栈,入栈,分为两步,a,指针上移,b,将数填入对应的栈内存中,

3.成功返回1

图示

答案

复制代码
// C 语言值传递的特性,只有传地址(指针),才能让函数修改外部变量的值,让调用者拿到这个数。
int Push (SqStack * S, DataType e){
    // 先判断栈满了吗?
    if(S->top>=STACKSIZE-1){
        return 0;
    }
    // 入栈
    S->top++;
    S->items[S->top]=e;
    return 1;
}
相关推荐
CoderYanger14 分钟前
A.每日一题:3345. 最小可整除数位乘积 I
java·数据结构·程序人生·算法·leetcode·面试·学习方法
带多刺的玫瑰15 分钟前
Leecode#16刷题之最接近的三数之和
数据结构·算法
橘子汽水16822 分钟前
Leetcode15:三数之和
java·数据结构·算法
Yfhonier1 小时前
6440. 极大连通图个数(DFS)
数据结构·算法·深度优先
Rnan-prince1 小时前
从 Bitmap、BloomFilter到 Count-Min Sketch:三个数据结构,一条“用误差换空间“的演进线
数据结构·sketch·bitmap
旖旎夜光1 小时前
LeetCode 974:和可被 K 整除的子数组(前缀和) —— 题解
数据结构·c++·算法·leetcode·前缀和
SelectDB技术团队1 小时前
StarRocks 适合做日志分析吗?
大数据·数据结构·后端·python·doris·日志分析·starrock
AI情绪识别开源2 天前
检信 ALLEMOTION OS 加密打包可执行程序 — 全面测试报告版本: v1.3功能测试 / 性能测试 /
开发语言·数据结构·人工智能·功能测试
伟大的车尔尼2 天前
贪心的概念
数据结构·算法·贪心
AI情绪识别开源2 天前
检信AI高一分班分科智选评估系统 v2.0测试报告
开发语言·数据结构·人工智能·科技