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,请在下方评论,我目前会天天上论坛的。

  • 相关阅读:
    eclipse中文乱码问题解决方案
    修改Tomcat的JDK目录
    Tomcat 5.5 修改服务器的侦听端口
    HTML DOM教程 27HTML DOM Button 对象
    HTML DOM教程 24HTML DOM Frameset 对象
    Navicat for MySQL v8.0.27 的注册码
    HTML DOM教程 25HTML DOM IFrame 对象
    Tomcat 5.5 的下载和安装
    android manifest相关属性
    ubuntu10.04 下 eclipse 小结
  • 原文地址:https://www.cnblogs.com/yellowgg/p/6735334.html
Copyright © 2011-2022 走看看