• 栈(顺序栈)实现Language C


    ###王道考研的学习领悟,个人喜好讲解清晰

    何为栈? 

    定义:栈(stack)是只允许在一端进行插入或删除的线性表。

    其重要术语:栈顶,栈底,空栈。

     我们只需要把这个图看明白了,理解起来就很快。

    在这次的栈实现中,我们会运用到类似顺序表的定义法,举个例子:

    Elemtype *data; == Elemtype data[Maxsize];

    在实际的代码操作中,指针与数组其实是等效的,指针指向一块申请的堆空间,而数组存在栈空间

    所以,我们在对于顺序栈的声明时,可以看作是对顺序表的一次结构体声明。 

    对于每个数据结构,我们都要反问自己三要素

    数据结构顺序表顺序栈
    逻辑结构结点相连,连续空间结点相连,连续空间
    物理结构连续空间连续空间
    数据的运算/基本操作可直接读取所有元素只能快速读取栈顶元素

     

    所以我们开始吧。

    栈的定义(Stack):

    一.栈的定义&初始化

    1. #include
    2. #define MAXSIZE 10 //这里我就定义它有10个连续空间
    3. typedef int Elemtype;
    4. typedef struct{
    5. Elemtype data[MAXSIZE]; //静态数组存放栈的元素
    6. int top; //栈顶指针--->一直指向栈顶
    7. }SqStack;//声明一个栈
    8. //初始化栈
    9. bool InitStack(SqStack &s){
    10. s.top = -1; //将栈的指针设为空
    11. return true;
    12. }

    补充一个小知识:如果我们使用---整型来定义数据结构的指针时,我们会使用 -1 来表示它此时指向为空,就相当于我们利用指针类型来定义的 中的NULL,空指针一样。

    -2可以表示为该空间暂时空闲。 其实我们也可将 s.top = 0; 这是另一种设法,后面的操作又会需要改变一些细节。这里我们用常用的设法来进行栈的操作定义吧。

    二.判断栈是否为空栈

    1. //判断是否为空栈, 只要指针指向的为 -1 初始定义时,就可以认为是空栈
    2. bool IsEmpty{SqStack s)
    3. {
    4. if (s.top == -1)
    5. {
    6. return true; //此时栈顶指针指向空
    7. }
    8. else
    9. {
    10. return false;
    11. }
    12. }

    三.栈的入栈(push)

    1. //栈的入栈,这里我会告诉你两种表示法,选择你喜欢的哪一个
    2. //@操作1
    3. bool Push1(SqStack &s,Elemtype e)
    4. {
    5. if (s.top == MAXSIZE-1)
    6. {
    7. return false; //判断是否满栈了
    8. }
    9. s.top = s.top + 1; //先把指针指向下一个栈顶
    10. s.data[top] = e; //再把目的数值赋给当前的栈顶
    11. return true;
    12. }
    13. //@操作二 ++a 的意思是,先进行a = a + 1的操作并把结果返回给操作中
    14. bool Push2(SqStack &s,Elemtype e)
    15. {
    16. if (s.top == MAXSIZE-1)
    17. {
    18. return false; //目的与操作一相同
    19. }
    20. s.data[++s.top] = e; //相当于把 操作1中的--- 1.指针加1 2.栈顶赋值 结合在一起写
    21. return true;
    22. }

    入栈就是先把 栈顶指针加一位,指向没有值的栈顶,再通过数组的快速寻值【address】-

    --> s.data[top] = e ,将 元素e赋给当前的栈,便完成了入栈操作。

    四.栈的出栈

    1. //栈的出栈
    2. //也有两个出栈写法
    3. bool Pop1(SqStack &s,Elemtype &e)
    4. {
    5. if (s.top == -1)
    6. {
    7. return false; //如果为空栈的话
    8. }
    9. //这时先把栈顶的值先拿出来
    10. e = s.data[s.top];
    11. s.top = s.top - 1;
    12. return true;
    13. }
    14. //出栈写法二 a-- 先完成该操作后 然后再进行 减1
    15. bool Pop1(SqStack &s,Elemtype &e)
    16. {
    17. if (s.top == -1)
    18. {
    19. return false; //如果为空的话
    20. }
    21. e = s.data[s.top--];
    22. return true;
    23. }

    五.读取栈顶元素

    1. //获取栈顶元素
    2. bool GetElem(SqStack s,Elemtype &e)
    3. {
    4. if (s.top == -1)
    5. {
    6. return false; //若为空,返回错
    7. }
    8. e = s.data[s.top];
    9. return true;
    10. }

    六.改变栈顶的值

    1. //改变栈顶的值
    2. bool ChangeNode(SqStack &s,Elemtype e)
    3. {
    4. if (s.top == -1)
    5. {
    6. return false;
    7. }
    8. s.data[s.top] = e;
    9. return true;
    10. }

    七.读取栈里的所有值

    1. //无返回值
    2. void PrintAll(SqStack s)
    3. {
    4. while( s.top != -1)
    5. {
    6. printf("%d",s.data[s.top]);
    7. }
    8. }

    以上就是基本的该栈的基本操作,感谢你的观看。

  • 相关阅读:
    快速排序(Quick Sort)
    ipsum cum quas tempora.
    常见的设计模式
    Github每日精选(第68期):HTTP客户端哪家强-reqwest
    Python之Django
    《哥德尔、艾舍尔、巴赫——集异璧之大成》阅读笔记1
    【数据分享】2006-2021年我国城市级别的道路、桥梁、管线建设相关指标(10多项指标)
    【校招VIP】排序算法之高级排序
    《代码随想录》刷题笔记——字符串篇【java实现】
    4-19 算法思路总结
  • 原文地址:https://blog.csdn.net/2301_80246346/article/details/136402766