zoukankan      html  css  js  c++  java
  • 数据结构学习日记3:顺序栈的实现(两种不同的方法)

      栈是数据结构中十分重要的一部分内容,关于栈的应用也十分的广泛,下面是顺序栈的实现,分别用了两种不同的方式,大致都是运用数组这一种线性的结构。

      栈的抽象数据类型:

      ADT 栈(Stack)

      Data:

        1.相同的类型2.相邻元素前驱后继的关系

      Operation操作

        InitStack(*s);初始化

        DestoryStack(*s):销毁栈

        ClearStack(*s):清空操作

        StackEmpty(s):判断栈为空

        GetTop(s):获取栈顶元素

        Push(*s,e):压入一个元素到栈中

        Pop(*s,*e):弹出栈中元素

        StackLength(s):获取栈中元素的个数

      第一种:

        

    // MyStack.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include<iostream>
    using namespace std;
    
    //定义的一些名称
    #define COUNT 50
    #define ERROR 0
    #define OK 1
    typedef int ElemType;
    typedef int Status;
    
    //栈的数据定义
    typedef struct
    {
        ElemType data[COUNT];
        int top;
    }LineStack,*PointStack;
    
    
    //栈的初始化
    Status InitStack(PointStack s)
    {
        if (!s)
        {
            return ERROR;
        }
        for (int i = 0; i < COUNT; i++)
        {
            s->data[i] = 0;
        }
        s->top = 0;
        return OK;
    }
    
    //栈的压入操作
    Status Push(PointStack s, ElemType e)
    {
        if (s->top == COUNT)
        {
            return ERROR;
        }
        s->data[s->top] = e;
        s->top++;
        return OK;
    }
    
    //栈的弹出操作
    Status Pop(PointStack s, ElemType *e)
    {
        if (s->top==0)
        {
            return ERROR;
        }
        s->top--;
        *e = s->data[s->top];
        s->data[s->top] = 0;
        return OK;
    }
    
    //栈的长度
    int StackLength(LineStack s)
    {
        if (&s)
        {
            return s.top;
        }
        return -1;
    }
    
    //判断栈是否为空
    Status StackEmpty(LineStack s)
    {
        if(s.top==0)
        {
            return OK;
        }
        return ERROR;
    }
    
    //清空栈
    Status ClearStack(PointStack s)
    {
        while (s->top!=0)
        {
            s->top--;
            s->data[s->top] = 0;
        }
        return OK;
    }
    
    //删除栈
    //Status DestroyStack(PointStack s)
    //{
    //    if (s)
    //    {
    //        free(s);
    //        return OK;
    //    }
    //    return ERROR;
    //}
    
    //获取栈顶元素
    Status GetTop(LineStack s,ElemType *e)
    {
        if (s.top != 0)
        {
            *e=s.data[s.top-1];
            return OK;
        }
        return ERROR;
    }
    
    int main()
    {
        cout << "***********一个简单的线性栈的实现*****************" << endl;
        //声明并初始化一个栈
        int status;//用来保存Status的值
        LineStack s;//系统已经为s分配了一个内存空间
        //初始化s,
        status=InitStack(&s);
        cout << "初始化是否成功:" << status << endl;
    
        //判断s是否为空
        status=StackEmpty(s);
        cout << "判断栈是否为空:" << status << endl;
    
        //压入元素到栈中
        status = Push(&s, 1);
        cout << "压入一个元素是否成功:" << status << endl;
        //压入元素到栈中
        status = Push(&s, 2);
        cout << "压入一个元素是否成功:" << status << endl;
        //压入元素到栈中
        status = Push(&s, 3);
        cout << "压入一个元素是否成功:" << status << endl;
        //压入元素到栈中
        status = Push(&s, 4);
        cout << "压入一个元素是否成功:" << status << endl;
        //压入元素到栈中
        status = Push(&s, 5);
        cout << "压入一个元素是否成功:" << status << endl;
    
        //取栈顶的元素
        ElemType a;
        status= GetTop(s, &a);
        cout << "取栈顶元素是否成功:" << status << "    栈顶的元素为:" << a << endl;
    
        //弹出栈顶元素
        ElemType b;
        status = Pop(&s, &b);
        cout << "弹出栈顶元素是否成功:" << status << "       弹出的元素为:" << b << endl;
    
        //取栈顶的元素
        ElemType c;
        status = GetTop(s, &c);
        cout << "取栈顶元素是否成功:" << status << "    栈顶的元素为:" << c << endl;
    
        //获取栈的长度
        int length = StackLength(s);
        cout << "栈的长度为:" << length << endl;
    
        //清空栈
        status = ClearStack(&s);
        cout << "清空栈中的元素是否成功:" << status << endl;
        //取栈顶的元素
        ElemType d;
        status = GetTop(s, &d);
        cout << "取栈顶元素是否成功:" << status << "    栈顶的元素为:" << d<< endl;
    
        ////销毁栈
        //status = DestroyStack(&s);
    
        cin.get();
        return 0;
    }

      执行结果:

      

      

      第二种:

        

    /***顺序栈的实现***/
    
    #include "stdafx.h"
    #include<iostream>
    #include<stdlib.h>
    using namespace std;
    
    //顺序栈定义
    #define OK 1
    #define ERROR 0
    #define OVERFLOW -2
    #define MAXSIZE  100
    typedef int Status;
    typedef int SElemType;
    typedef struct {
        SElemType *base;
        SElemType *top;
        int stacksize;
    }SqStack;
    
    //算法3.1 顺序栈的初始化
    Status InitStack(SqStack &S)
    {// 构造一个空栈 S 
        S.base = new SElemType[MAXSIZE];    //为顺序栈分配一个最大容量为MAXSIZE的数组空间
        if (!S.base)
            exit(OVERFLOW);        //存储分配失败
        S.top = S.base;
        S.stacksize = MAXSIZE;
        return OK;
    }
    //算法3.2 顺序栈的入栈
    Status Push(SqStack &S, SElemType &e)
    { // 插入元素e为新的栈顶元素
        if (S.top - S.base == S.stacksize)
            return ERROR;    //栈满
        *(S.top++) = e;    //元素e压入栈顶,栈顶指针加1
        return OK;
    }
    //算法3.3 顺序栈的出栈
    Status Pop(SqStack &S, SElemType &e)
    {// 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
        if (S.base == S.top)
            return ERROR;//栈空
        e = *(--S.top); //栈顶指针减1,将栈顶元素赋给e
        return OK;
    }
    //算法3.4 取顺序栈的栈顶元素
    Status GetTop(SqStack S, SElemType &e)
    {// 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR
        if (S.top == S.base)
            return ERROR;
        e = *(S.top - 1);//栈顶指针减1,将栈顶元素赋给e
        return OK;
    }
    
    int main()
    {
        SqStack s;
        SElemType e;
        SElemType t;
        cout << "进栈元素依次为:" << endl;
        if (InitStack(s) == OK)
            for (int j = 1; j <= 12; j++)
            {
                Push(s, j);
                cout << j << "  ";
            }
        cout << endl << "依次弹出的栈顶元素为:" << endl;
        while (GetTop(s, e) == OK)
        {
            cout << e << "  ";
            Pop(s, t);
        }
        cin.get();
        return 0;
    }

      执行结果:

      

      以上还有一个没有问题没有太懂,第一种实现方式中的DestoryStack(*s),用free()释放内存存在问题,网上查了说free()和delete()释放内存是存在差别的,大致是讲new和delete是成对使用的,而free是和malloc使用的,由于水平有限,后续会完善补上;同时希望知道的小伙伴能在下方留言,十分感谢!

  • 相关阅读:
    每天学一点管理知识——100-1=0定律
    每天学一点管理知识——赫勒法则
    每天学一点管理知识——卡贝定律
    每天学一点管理知识——韦特莱法则
    每天学一点管理知识——【证人的记忆】
    开发平台的优势在哪?
    WF工作流与管理类应用系统工作流需求实现的一些误区
    命名空间
    函数
    删除补充/集合/深浅拷贝
  • 原文地址:https://www.cnblogs.com/springword/p/6118726.html
Copyright © 2011-2022 走看看