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

[复制链接]
3057|26
 楼主| 韩山童 发表于 2017-1-5 11:36 | 显示全部楼层 |阅读模式
本文实现数据结构中堆栈的C语言实现。栈是一个后进先出的数据结构,它的作用是将对象序列进行反转。OK,废话少说,我们来看看如何用C语言实现一个堆栈吧。
1.首先,定义堆栈的数据结构,由于我们使用C语言实现,所以使用struct来定义堆栈的数据类型:
  1. typedef int ElemType;      //堆栈中的元素数据类型
  2. #define MaxSize (256)              //堆栈所能容纳的最大元素个数
  3. #define ERROR  (0XFFFFFFFF)
  4. typedef srtuct
  5. {
  6.       ElemType data[MaxSize];
  7.       int top;                              //栈顶指针
  8. }Stack,*PStack;


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

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

  10. }


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

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


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

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

   
  1. //输出栈中的元素,但不出栈
  2. void print(Stack* st)
  3. {
  4.     int index = st->top;
  5.     while(index >= 0)
  6.     {
  7.         printf("%d ",st->data[index--]);
  8.     }
  9. }


(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 | 显示全部楼层
 楼主| 韩山童 发表于 2017-1-5 15:04 | 显示全部楼层
yyy71cj 发表于 2017-1-5 11:49
堆栈是一个典型的对象,而且在一些处理领域比较常用……

 楼主| 韩山童 发表于 2017-1-5 15:05 | 显示全部楼层
火山LF 发表于 2017-1-5 11:50
听说童子同学快毕业找工作了,加油啦

蟹蟹
 楼主| 韩山童 发表于 2017-1-5 15:05 | 显示全部楼层
yyy71cj 发表于 2017-1-5 11:49
堆栈是一个典型的对象,而且在一些处理领域比较常用……

有空我补充C++的实现
大牙缝 发表于 2017-1-5 15:37 | 显示全部楼层
学习学习
 楼主| 韩山童 发表于 2017-1-5 16:21 | 显示全部楼层
帖子的标题有个字写错了,不好意思。
 楼主| 韩山童 发表于 2017-1-5 16:25 | 显示全部楼层
Simon21ic 发表于 2017-1-5 17:23 | 显示全部楼层
韩山童 发表于 2017-1-5 16:25
https://bbs.21ic.com/icview-1658420-1-1.html

C++里用了模板可以支持各种不同的类型,C语言里为啥不用呢?
 楼主| 韩山童 发表于 2017-1-5 17:57 | 显示全部楼层
Simon21ic 发表于 2017-1-5 17:23
C++里用了模板可以支持各种不同的类型,C语言里为啥不用呢?

C语言不支持模板啊
Simon21ic 发表于 2017-1-5 18:20 | 显示全部楼层
韩山童 发表于 2017-1-5 17:57
C语言不支持模板啊

不支持就不能实现了吗?
 楼主| 韩山童 发表于 2017-1-5 19:22 | 显示全部楼层
Simon21ic 发表于 2017-1-5 18:20
不支持就不能实现了吗?

这个没试过,您可以试试。我一般会这样做:typedef int ElemType; 你可以将int改成你想要的数据类型。蟹蟹!
 楼主| 韩山童 发表于 2017-1-5 19:25 | 显示全部楼层
Simon21ic 发表于 2017-1-5 18:20
不支持就不能实现了吗?

https://bbs.21ic.com/icview-1658420-1-1.html你可以看看这个,这是C++实现的
Simon21ic 发表于 2017-1-5 20:57 | 显示全部楼层
本帖最后由 Simon21ic 于 2017-1-5 21:04 编辑
韩山童 发表于 2017-1-5 19:22
这个没试过,您可以试试。我一般会这样做:typedef int ElemType; 你可以将int改成你想要的数据类型。蟹 ...

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

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

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

第一个问题先让我再想想啊。第二个问题:多任务环境下,数据的同步很重要。
 楼主| 韩山童 发表于 2017-1-5 21:28 | 显示全部楼层
Simon21ic 发表于 2017-1-5 20:57
那也就是说,如果我想实现2个stack,针对不同的类型,我就需要把代码复制一份?
这个的回答是你考虑之后的 ...

不会是用宏来实现吧
 楼主| 韩山童 发表于 2017-1-5 21:44 | 显示全部楼层
Simon21ic 发表于 2017-1-5 20:57
那也就是说,如果我想实现2个stack,针对不同的类型,我就需要把代码复制一份?
这个的回答是你考虑之后的 ...

或者用void*实现
 楼主| 韩山童 发表于 2017-1-5 21:55 | 显示全部楼层
韩山童 发表于 2017-1-5 21:28
不会是用宏来实现吧

真是用宏实现的话,我确实不敢兴趣,哈哈~~~
Simon21ic 发表于 2017-1-5 23:48 | 显示全部楼层
本帖最后由 Simon21ic 于 2017-1-5 23:51 编辑
韩山童 发表于 2017-1-5 21:55
真是用宏实现的话,我确实不敢兴趣,哈哈~~~

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

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

呵呵,我只是随便说说,你没兴趣的话,我就不乱引导你了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

43

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部