C语言详解如何实现顺序栈

 更新时间:2022年04月22日 11:54:52   作者:平凡的人1  
顺序栈,就是用一组地址连续的存储单元来存放栈元素,然后用一个栈结构去维护一个栈。在C中,可用动态开辟的数组去表示,维护的栈结构需要有一个栈底和一个栈顶指针

今天说的是关于数据结构顺序栈的一些基本操作c语言实现。

顺序栈的定义

首先,我们先来简单了解一下顺序栈,前面线性表我们知道,根据顺序存储或者链式存储分为顺序表和单链表,同样的,根据存储方式的不同,我们把栈分为顺序存储的栈称为顺序栈,链式存储的栈称为链栈。我们要讲的就是顺序栈。实际上,有了前面线性表的一些知识后,关于栈的操作我们还是比较容易理解的。

顺序栈的理解

问题来了?我们怎么去定义呢?通常我们可以用一个数组和记录栈顶元素位置的变量组成,栈顶位置用整型变量Top记录当前栈顶元素的下标值。当Top==-1时,表示空栈。当top==MAXSIZE-1时,表示满栈。好了,下面开始实现顺序栈。

准备工作

1.宏定义及其重命名

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20 /* 存储空间初始分配量 */
typedef int Status; 
typedef int SElemType; /* SElemType类型根据实际情况而定,这里假设为int */

2.结构体(顺序栈的表示方式)

/* 顺序栈结构 */
typedef struct
{
        SElemType data[MAXSIZE];
        int top; /* 用于栈顶指针 */
}SqStack;

具体实现

1.初始化

/*  构造一个空栈S */
Status InitStack(SqStack *S)
{ 
        /* S.data=(SElemType *)malloc(MAXSIZE*sizeof(SElemType)); */
        S->top=-1;
        return OK;
}

2.清空

/* 把S置为空栈 */
Status ClearStack(SqStack *S)
{ 
        S->top=-1;
        return OK;
}

3.判断是否为空

/* 若栈S为空栈,则返回TRUE,否则返回FALSE */
Status StackEmpty(SqStack S)
{ 
        if (S.top==-1)
                return TRUE;
        else
                return FALSE;
}

4.求长度

/* 返回S的元素个数,即栈的长度 */
int StackLength(SqStack S)
{ 
        return S.top+1;
}

5.求栈顶元素

/* 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR */
Status GetTop(SqStack S, SElemType* e)
{
    if (S.top == -1) {
        return ERROR;
    }
    else {
        *e = S.data[S.top];
        return OK;
    }
}

6.入栈(判断是否满了)

/* 插入元素e为新的栈顶元素 */
Status Push(SqStack* S, SElemType e)
{
    if (S->top == MAXSIZE - 1) /* 栈满 */
    {
        return ERROR;
    }
    S->top++;				/* 栈顶指针增加一 */
    S->data[S->top] = e;  /* 将新插入元素赋值给栈顶空间 */
    return OK;
}

7.出栈(判断是否为空)

/* 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR */
Status Pop(SqStack* S, SElemType* e)
{
    if (S->top == -1)
        return ERROR;
    *e = S->data[S->top];	/* 将要删除的栈顶元素赋值给e */
    S->top--;				/* 栈顶指针减一 */
    return OK;
}

8.遍历

/* 从栈底到栈顶依次对栈中每个元素显示 */
Status StackTraverse(SqStack S)
{
    int i;
    i = 0;
    while (i <= S.top)
    {
        visit(S.data[i++]);
    }
    printf("\n");
    return OK;
}
Status visit(SElemType c)
{
    printf("%d ", c);
    return OK;
}

主函数

int main()
{
    int j;
    SqStack s;
    int e;
    if (InitStack(&s) == OK)
        for (j = 1; j <= 10; j++)
            Push(&s, j);
    printf("栈中元素依次为:");
    StackTraverse(s);
    Pop(&s, &e);
    printf("弹出的栈顶元素 e=%d\n", e);
    printf("栈空否:%d(1:空 0:否)\n", StackEmpty(s));
    GetTop(s, &e);
    printf("栈顶元素 e=%d 栈的长度为%d\n", e, StackLength(s));
    ClearStack(&s);
    printf("清空栈后,栈空否:%d(1:空 0:否)\n", StackEmpty(s));
    return 0;
}

好啦,本次顺序栈的一些知识就结束了。

到此这篇关于C语言详解如何实现顺序栈的文章就介绍到这了,更多相关C语言顺序栈内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言数据结构与算法之时间空间复杂度入门

    C语言数据结构与算法之时间空间复杂度入门

    这篇文章主要为大家介绍了C语言数据结构与算法之时间空间复杂度的入门教程示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-02-02
  • C++字符串提取和分割的多种方法

    C++字符串提取和分割的多种方法

    在C++编程中,字符串处理是一个常见的任务,尤其是在需要从字符串中提取特定数据时,本文将详细探讨如何使用C++标准库中的工具来提取和分割字符串,并分析不同方法的适用场景和优缺点,我们将通过多个示例代码逐步讲解,帮助读者掌握字符串处理的技巧,需要的朋友可以参考下
    2025-03-03
  • C++标准库介绍及使用string类的详细过程

    C++标准库介绍及使用string类的详细过程

    C++中将string封装为单独的类,string 类是 C++ 标准库中的一个非常重要的类,用于表示和操作字符串,这篇文章主要介绍了C++标准库介绍及使用string类,需要的朋友可以参考下
    2024-08-08
  • C++面试八股文之了解auto关键字

    C++面试八股文之了解auto关键字

    这篇文章主要为大家介绍了C++面试八股文之了解auto关键字问题解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • C++内存管理详细解析

    C++内存管理详细解析

    这篇文章主要给大家分享的是C++内存管理的详细内容学习,下面文章围绕C++内存管理的相关资料展开具体学习内容,需要的朋友可以参考一下,希望对你有所帮助
    2021-11-11
  • map插入自定义对象总结

    map插入自定义对象总结

    黑树在插入节点时,必须依照大小比对之后在一个合适的位置上执行插入动作。所以作为关键字,起码必须有“<”这个比较操作符
    2013-09-09
  • C++详解如何实现两个线程交替打印

    C++详解如何实现两个线程交替打印

    这篇文章主要介绍了使用C++库实现两个线程交替打印,一个线程打印奇数、一个线程打印偶数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • C语言文件操作入门指南

    C语言文件操作入门指南

    我们在想既然是通讯录就应该把信息记录下来,只有我们自己选择删除数据的时候,数据才不复存在,这就涉及到了数据持久化的问题,我们一般数据持久化的方法有,把数据存放在磁盘文件、存放到数据库等方式,使用文件我们可以将数据直接存放在电脑的硬盘上,做到了数据的持久化
    2024-08-08
  • C++ 反向迭代器模拟实现

    C++ 反向迭代器模拟实现

    反向迭代器reverse_iterator是一种反向遍历容器的迭代器,也就是从最后一个元素到第一个元素遍历容器,本文主要介绍了C++ 反向迭代器模拟实现,感兴趣的可以了解一下
    2024-01-01
  • C++实现求动态矩阵各元素的和

    C++实现求动态矩阵各元素的和

    这篇文章主要为大家详细介绍了C++实现求动态矩阵各元素的和,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10

最新评论