zoukankan      html  css  js  c++  java
  • 简单用数组模拟顺序栈(c++)

    **栈是一种操作受限制的线性表,太多官方的话我也不说了,我们都知道栈元素是先进后出的,它有两种存储结构,分别是顺序存储结构和链式存储结构。

    **今天我先记一下顺序存储结构,后面我会加上链式存储结构的。

    **我看到别人的顺序栈都是用别的方式来写的,我现在这里用的是一维数组,也就是用数组模拟。由于要用到bool型,所以我直接用c++来写,大家可以相应改成C语言的版本,并不难。

    **顺序栈的操作 无非是基本的八个,分别是初始化,出栈,入栈,是否为空,是否为满,取栈顶元素,取有效元素个数,遍历。

    **如果用静态数组模拟的话,不需要销毁栈,(我个人觉得 如果有误,请指正) 清空的话,直接初始化就行。顺序栈的示意图如下:

     

    不多说了,直接给代码参考:

    在这里我用拼音来代替函数,让新手看得明白一点,我这里用的是结构体来生成一个栈,这个栈有一百个格子,还有一个top指针,大家结合示意图来看就会很形象的。

     

    # include<iostream>

    using namespace std;

    typedef struct

    {

       int d[100];//定义一个长度为100的一维数组这里可以随便设置长度

       int top;//栈顶指针

    } Stack;

    void chushihua(Stack * s);//初始化一个栈

    bool em(Stack * s);//判断是否为空

    bool full(Stack * s);//判断是否为满

    bool push(Stack * s,int a);//入栈

    bool pop(Stack * s,int *a);//出栈

    bool ding(Stack * s,int *a);//取栈顶元素

    int len(Stack * s);//取有效元素个数

    void bianli(Stack * s);//遍历

     

     

     *****************************************************************

     

    函数部分:

     

    *****初始化一个栈*****

    void chushihua(Stack * s);

    {

       s->top=-1;  //结合示意图让top为-1  就是初始化这个栈

    }

     

    *****判断是否为空 *****

    bool em(Stack * s)

    {

        if(-1==s->top)

           return true;

       else

           return  false;

    }

     

    *****判断是否为满 *****

    bool full(Stack * s)

    {

       if(99==s->top)//这里是因为数组的下标为零 所以对于一百来说 99就是最后一个“格子”

           return true;

       else

           return false;

    }

     

    *****入栈*****

    bool push(Stack * s,int a)

    {

       if(full(s))  //满了就不能入栈

           return false;

       else

        {

           s->top++;  //结合图  指针先加

           s->d[s->top]=a;//  再把数据存进对应的“格子”

           return true;

        }

    }

     

     

     

    *****出栈*****

    bool pop(Stack * s,int *a)

    {

       if(em(s))//  空的当然不能出栈

           return false;

       else

        {

           *a=s->d[s->top]; //把栈顶元素 付给 变量

           s->top--; //指针减一

           return true;

        }

    }

     

     

     

     

    *****取栈顶元素*****

    这里只是取栈顶元素 不对栈有任何操作

    bool ding(Stack * s,int *a)

    {

       if(em(s)) //同理 空栈没有元素 就不行

           return false;

       else

        {

           *a=s->d[s->top]; // 把栈顶的元素赋值即可

           return true;

        }

    }

     

    *****取有效元素长度*****

    由图我们可知,指针+1就是有效元素长度了

    int len(Stack * s)

    {

       return s->top+1;

    }

     

    *****遍历*****

    void bianli(Stack * s)

    {

       int i;

       while(!em(s))//当不为空栈

        {

           pop(s,&i);  //我们就出栈并赋值

           cout<<i<<" "; // 打印

        }

       cout<<endl;//这是相当于C语言中的换行

    }

    ***************************************************************** 

    主函数部分(测试)

     

    int main(void)

    {

    Stack s;
        int a,c;
        chushihua(&s);
        push(&s,1);
        push(&s,2);
        push(&s,3);
        push(&s,4);
        push(&s,5);
        ding(&s,&a);
      cout<<"有效长度为:"<<len(&s)<<" 栈顶元素为 "<<a<<endl;
        bianli(&s);
        return 0;

    }

     如图:

    以上就是用数组模拟顺序栈的过程,如果有什么问题或者bug,请在下方评论,我目前会天天上论坛的。

  • 相关阅读:
    给函数中的形参设置默认值
    css-文字一行显示效果
    考试倒计时-通过开始时间字符串和间隔时间戳设置考试倒计时
    vue父向子传值,子组件无法及时更新父组件传过来的值的问题
    vue+elementUI在输入框中按回车键会刷新页面
    前端面试题记录
    Web是如何工作的:基本架构和原理
    JavaScript构造函数和原型概述
    js byte字节流和数字,字符串之间的转换,包含无符和有符之间的转换
    C#串口通讯,复制粘贴就可用,仅仅介绍怎样最快的搭建一个串口通讯,异常拦截等等需要自己加上
  • 原文地址:https://www.cnblogs.com/yellowgg/p/6735334.html
Copyright © 2011-2022 走看看