服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C语言详解如何实现顺序栈

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

2022-11-14 13:38平凡的人1 C/C++

顺序栈,就是用一组地址连续的存储单元来存放栈元素,然后用一个栈结构去维护一个栈。在C中,可用动态开辟的数组去表示,维护的栈结构需要有一个栈底和一个栈顶指针

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

顺序栈的定义

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

顺序栈的理解

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

准备工作

1.宏定义及其重命名

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

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

?
1
2
3
4
5
6
/* 顺序栈结构 */
typedef struct
{
        SElemType data[MAXSIZE];
        int top; /* 用于栈顶指针 */
}SqStack;

具体实现

1.初始化

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

2.清空

?
1
2
3
4
5
6
/* 把S置为空栈 */
Status ClearStack(SqStack *S)
{
        S->top=-1;
        return OK;
}

3.判断是否为空

?
1
2
3
4
5
6
7
8
/* 若栈S为空栈,则返回TRUE,否则返回FALSE */
Status StackEmpty(SqStack S)
{
        if (S.top==-1)
                return TRUE;
        else
                return FALSE;
}

4.求长度

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

5.求栈顶元素

?
1
2
3
4
5
6
7
8
9
10
11
/* 若栈不空,则用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.入栈(判断是否满了)

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

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

?
1
2
3
4
5
6
7
8
9
/* 若栈不空,则删除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.遍历

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/* 从栈底到栈顶依次对栈中每个元素显示 */
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;
}

主函数

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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语言顺序栈内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/weixin_60478154/article/details/123809529

延伸 · 阅读

精彩推荐
  • C/C++C语言实现车辆信息管理系统

    C语言实现车辆信息管理系统

    这篇文章主要为大家详细介绍了C语言实现车辆信息管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    无人可阻挡5132022-10-20
  • C/C++C语言编写Linux守护进程实例

    C语言编写Linux守护进程实例

    这篇文章主要介绍了C语言编写Linux守护进程实例,本文讲解了守护进程及其特性、守护进程的编程要点、守护进程代码实例等内容,需要的朋友可以参考下...

    C语言程序设计5002021-02-21
  • C/C++纯C语言:递归二进制转十进制源码分享

    纯C语言:递归二进制转十进制源码分享

    这篇文章主要介绍了纯C语言:递归二进制转十进制源码,有需要的朋友可以参考一下...

    C语言程序设计10672021-01-12
  • C/C++C++控制台实现简单注册登录

    C++控制台实现简单注册登录

    这篇文章主要为大家详细介绍了C++控制台实现简单注册登录,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    乔路非11382021-10-16
  • C/C++C语言简单编程速成

    C语言简单编程速成

    我们将所有的 C 语言要素放置到一份易读的备忘录上。C 语言是一种相当简约和直接的语言。除了编程的基础知识之外,并没有很高级的概念,这很大程度...

    Linux中国4312020-10-19
  • C/C++Linux系统下C语言gets函数出现警告问题的解决方法

    Linux系统下C语言gets函数出现警告问题的解决方法

    这篇文章主要给大家介绍了关于在Linux系统下C语言gets函数出现警告问题的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的...

    Linuxidc7232021-07-12
  • C/C++c++基础语法:构造函数与析构函数

    c++基础语法:构造函数与析构函数

    构造函数用来构造一个对象,主要完成一些初始化工作,如果类中不提供构造函数,编译器会默认的提供一个默认构造函数(参数为空的构造函数就是默认构...

    C++教程网7042021-01-01
  • C/C++C++插入排序算法实例

    C++插入排序算法实例

    这篇文章主要介绍了C++插入排序算法实例,本文先是讲解了什么插入排序,然后给出了C++代码实例,需要的朋友可以参考下...

    果冻想9852021-02-05