打印

数据结构值堆栈的C语言实现

[复制链接]
2502|26
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
韩山童|  楼主 | 2017-1-5 11:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本文实现数据结构中堆栈的C语言实现。栈是一个后进先出的数据结构,它的作用是将对象序列进行反转。OK,废话少说,我们来看看如何用C语言实现一个堆栈吧。
1.首先,定义堆栈的数据结构,由于我们使用C语言实现,所以使用struct来定义堆栈的数据类型:
typedef int ElemType;      //堆栈中的元素数据类型
#define MaxSize (256)              //堆栈所能容纳的最大元素个数
#define ERROR  (0XFFFFFFFF)
typedef srtuct
{
      ElemType data[MaxSize];
      int top;                              //栈顶指针
}Stack,*PStack;


2.堆栈的操作主要有入栈(push)和出栈(pop)两个操作,其它操作还有创建堆栈,判断栈空,判断栈满,返回栈中当前的元素个数等等。OK。下面我们一一实现他们。
(1)首先我们先创建一个堆栈,很简单,直接定义即可:Stack st;因为初始时栈是空的,所以将栈顶元素设置为-1,即st.top=-1;
(2)入栈操作的实现:
void push(Stack* st,ElemType e)
{
    if(isFull(st))//判断栈是否已满
    {
        printf("栈已经满\n");
        return;
    }

    //栈没有满则入栈
    st->data[++(st->top)] = e;

}


(3)出栈操作:
ElemType pop(Stack* st)
{
    if (isEmpty(st))//判断栈是否已空
    {
        printf("栈已经为空!\n");
        return ERROR;  //返回错误标志
    }

    //栈没空,则出栈
    return st->data[(st->top)--];
}


(4)辅助函数的实现:
//判断栈是否已满
uint8_t isFull(Stack* st)
{
    return (st->top == MaxSize-1) ? 1 : 0;
}

//判断栈是否已空
uint8_t isEmpty(Stack* st)
{
    return (st->top == -1) ? 1 : 0;
}

   
//输出栈中的元素,但不出栈
void print(Stack* st)
{
    int index = st->top;
    while(index >= 0)
    {
        printf("%d ",st->data[index--]);
    }
}


(5)测试结果:
int main()
{
    Stack st;
    st.top = -1;
    push(&st,1);
    push(&st,2);
    push(&st,3);
    push(&st,4);
    push(&st,5);

    print(&st);
    return 0;
}

输出:5 4 3 2 1

OK,到此,我们的堆栈就实现好了。有面向对象基础的朋友可以试着将栈封装起来。本文的栈使用顺序存储的方式,也就是用数组对对数据进行存储,栈的空间是有限的,灵活性不够。下个博文我将使用链式存储来实现,这样栈的空间就有可能达到程序中所有可用的内存了。本文属于原创,转载请标明出处,有错误请各位朋友指正。蟹蟹!

相关帖子

沙发
火山LF| | 2017-1-5 11:50 | 只看该作者
听说童子同学快毕业找工作了,加油啦

使用特权

评论回复
板凳
Meyeah| | 2017-1-5 14:13 | 只看该作者
666

使用特权

评论回复
地板
韩山童|  楼主 | 2017-1-5 15:04 | 只看该作者
yyy71cj 发表于 2017-1-5 11:49
堆栈是一个典型的对象,而且在一些处理领域比较常用……

使用特权

评论回复
5
韩山童|  楼主 | 2017-1-5 15:05 | 只看该作者
火山LF 发表于 2017-1-5 11:50
听说童子同学快毕业找工作了,加油啦

蟹蟹

使用特权

评论回复
6
韩山童|  楼主 | 2017-1-5 15:05 | 只看该作者
yyy71cj 发表于 2017-1-5 11:49
堆栈是一个典型的对象,而且在一些处理领域比较常用……

有空我补充C++的实现

使用特权

评论回复
7
大牙缝| | 2017-1-5 15:37 | 只看该作者
学习学习

使用特权

评论回复
8
韩山童|  楼主 | 2017-1-5 16:21 | 只看该作者
帖子的标题有个字写错了,不好意思。

使用特权

评论回复
9
韩山童|  楼主 | 2017-1-5 16:25 | 只看该作者
10
Simon21ic| | 2017-1-5 17:23 | 只看该作者
韩山童 发表于 2017-1-5 16:25
https://bbs.21ic.com/icview-1658420-1-1.html

C++里用了模板可以支持各种不同的类型,C语言里为啥不用呢?

使用特权

评论回复
11
韩山童|  楼主 | 2017-1-5 17:57 | 只看该作者
Simon21ic 发表于 2017-1-5 17:23
C++里用了模板可以支持各种不同的类型,C语言里为啥不用呢?

C语言不支持模板啊

使用特权

评论回复
12
Simon21ic| | 2017-1-5 18:20 | 只看该作者
韩山童 发表于 2017-1-5 17:57
C语言不支持模板啊

不支持就不能实现了吗?

使用特权

评论回复
13
韩山童|  楼主 | 2017-1-5 19:22 | 只看该作者
Simon21ic 发表于 2017-1-5 18:20
不支持就不能实现了吗?

这个没试过,您可以试试。我一般会这样做:typedef int ElemType; 你可以将int改成你想要的数据类型。蟹蟹!

使用特权

评论回复
14
韩山童|  楼主 | 2017-1-5 19:25 | 只看该作者
Simon21ic 发表于 2017-1-5 18:20
不支持就不能实现了吗?

https://bbs.21ic.com/icview-1658420-1-1.html你可以看看这个,这是C++实现的

使用特权

评论回复
15
Simon21ic| | 2017-1-5 20:57 | 只看该作者
本帖最后由 Simon21ic 于 2017-1-5 21:04 编辑
韩山童 发表于 2017-1-5 19:22
这个没试过,您可以试试。我一般会这样做:typedef int ElemType; 你可以将int改成你想要的数据类型。蟹 ...

那也就是说,如果我想实现2个stack,针对不同的类型,我就需要把代码复制一份?
这个的回答是你考虑之后的吗?如果是的话,我告诉你怎么实现,如果没考虑过的话,那估计你也没兴趣知道怎么实现,呵呵
我还没告诉你方案,干嘛谢我?

另外,代码一般都会有适用范围,你的代码,在抢占式多任务环境下,会有什么问题?

使用特权

评论回复
16
韩山童|  楼主 | 2017-1-5 21:26 | 只看该作者
Simon21ic 发表于 2017-1-5 20:57
那也就是说,如果我想实现2个stack,针对不同的类型,我就需要把代码复制一份?
这个的回答是你考虑之后的 ...

第一个问题先让我再想想啊。第二个问题:多任务环境下,数据的同步很重要。

使用特权

评论回复
17
韩山童|  楼主 | 2017-1-5 21:28 | 只看该作者
Simon21ic 发表于 2017-1-5 20:57
那也就是说,如果我想实现2个stack,针对不同的类型,我就需要把代码复制一份?
这个的回答是你考虑之后的 ...

不会是用宏来实现吧

使用特权

评论回复
18
韩山童|  楼主 | 2017-1-5 21:44 | 只看该作者
Simon21ic 发表于 2017-1-5 20:57
那也就是说,如果我想实现2个stack,针对不同的类型,我就需要把代码复制一份?
这个的回答是你考虑之后的 ...

或者用void*实现

使用特权

评论回复
19
韩山童|  楼主 | 2017-1-5 21:55 | 只看该作者
韩山童 发表于 2017-1-5 21:28
不会是用宏来实现吧

真是用宏实现的话,我确实不敢兴趣,哈哈~~~

使用特权

评论回复
20
Simon21ic| | 2017-1-5 23:48 | 只看该作者
本帖最后由 Simon21ic 于 2017-1-5 23:51 编辑
韩山童 发表于 2017-1-5 21:55
真是用宏实现的话,我确实不敢兴趣,哈哈~~~

堆栈、fifo等基本功能,实现起来确实非常简单
但是单独拿出一个stack的实现,其实没啥意义

不过比较好奇,为啥对宏模板不感兴趣?
你知道宏模板的有点和缺点,在什么情况下适合使用吗?
任何代码,都有适用的环境,关键就看开发人员是否知道优缺点,才能在适合的环境下选择适合的代码

呵呵,我只是随便说说,你没兴趣的话,我就不乱引导你了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

43

帖子

1

粉丝