数据结构学习日记3:顺序栈的实现(两种不同的方法)

时间:2022-11-17 10:23:47

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

  栈的抽象数据类型:

  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;
}

 

  执行结果:

  数据结构学习日记3:顺序栈的实现(两种不同的方法)

  

  第二种:

    

/***顺序栈的实现***/

#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;
}

 

  执行结果:

  数据结构学习日记3:顺序栈的实现(两种不同的方法)

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