(C语言版)栈和队列(二)——实现顺序存储栈和顺序存储队列的相关操作

http://blog.csdn.net/fisherwan/article/details/21479649

 栈和队列都有两种实现方式,一种在之前已经写过了,是链式存储形式,另一种是顺序存储形式。也就是这里所写的用数组的形式实现,和链式存储形式相比,有几个不同的地方。

  1. 顺序存储的方式,必须确定栈和队列的大小,也就是要确定数组的大小。而链式储存是动态分配的,根据需要来增减。
  2. 顺序存储的方式有溢出的现象,由于是数组存储,所以超出数组下标的时候就溢出了。

        下面上代码:

SequentialStack.h 顺序存储栈头文件

[cpp] view plain copy
  1. #ifndef _SEQUENTIALSTACK_H_H  
  2. #define _SEQUENTIALSTACK_H_H  
  3.   
  4. typedef int SStackEle;  
  5. const int MAXSTACK = 20;  
  6.   
  7. typedef struct SSTACK  
  8. {  
  9.     SStackEle arrele[MAXSTACK];  
  10.     SStackEle top;  
  11. }SStack;  
  12.   
  13. //初始化顺序栈  
  14. void InitSStack(SStack &s);  
  15.   
  16. //压入栈  
  17. void PushSStack(SStack &s, SStackEle ele);  
  18.   
  19. //出栈  
  20. void PopSStack(SStack &s, SStackEle &ele);  
  21.   
  22. //判断栈是否为空  
  23. bool IsemptySStack(SStack s);  
  24.   
  25. //得到栈顶元素  
  26. SStackEle GetTopSStack(SStack s);  
  27.   
  28. #endif  
SequentialQueue.h 顺序存储队列头文件

[cpp] view plain copy
  1. #ifndef _SEQUENTIALQUEUE_H_H  
  2. #define _SEQUENTIALQUEUE_H_H  
  3.   
  4. typedef int SQueueEle;  
  5. const int MAXQUEUE = 10;  
  6.   
  7. typedef struct SQUEUE  
  8. {  
  9.     SQueueEle arrele[MAXQUEUE];  
  10.     SQueueEle front, rear;  
  11. }SQueue;  
  12.   
  13. //初始化顺序队列  
  14. void InitSQueue(SQueue &q);  
  15.   
  16. //入队  
  17. void EnSQueue(SQueue &q, SQueueEle ele);  
  18.   
  19. //出队  
  20. void DeSQueue(SQueue &q, SQueueEle &ele);  
  21.   
  22. //判断队列是否为空  
  23. bool IsemptySQueue(SQueue q);  
  24.   
  25. //获得队头元素  
  26. SQueueEle GetFrontSQueue(SQueue q);  
  27.   
  28. #endif  

SequentialStack.cpp 顺序存储栈源文件

[cpp] view plain copy
  1. #include "SequentialStack.h"  
  2. #include <stdio.h>  
  3.   
  4. //初始化顺序栈  
  5. void InitSStack(SStack &s)  
  6. {  
  7.     s.top = -1;  
  8. }  
  9.   
  10. //压入栈  
  11. void PushSStack(SStack &s, SStackEle ele)  
  12. {  
  13.     s.top++;  
  14.     if (s.top < MAXSTACK)  
  15.         s.arrele[s.top] = ele;  
  16.     else  
  17.         printf("栈满,不能进行压入操作!\n");  
  18. }  
  19.   
  20. //出栈  
  21. void PopSStack(SStack &s, SStackEle &ele)  
  22. {  
  23.     if (s.top < 0)  
  24.         printf("栈空,不能进行出栈操作!\n");  
  25.     else  
  26.     {  
  27.         ele = s.arrele[s.top];  
  28.         s.top--;  
  29.     }  
  30. }  
  31.   
  32. //判断顺序栈是否为空  
  33. bool IsemptySStack(SStack s)  
  34. {  
  35.     if (s.top = -1)  
  36.         return true;  
  37.     else  
  38.         return false;  
  39. }  
  40.   
  41. //获得栈顶元素值  
  42. SStackEle GetTopSStack(SStack s)  
  43. {  
  44.     if (s.top < 0)  
  45.         printf("栈空,不能获得栈顶元素值!\n");  
  46.     else  
  47.         return s.arrele[s.top];  
  48. }  

SequentialQueue.cpp 顺序存储队列源文件

[cpp] view plain copy
  1. #include "SequentialQueue.h"  
  2. #include <stdio.h>  
  3.   
  4. //初始化顺序队列  
  5. void InitSQueue(SQueue &q)  
  6. {  
  7.     q.front = q.rear = -1;  
  8. }  
  9.   
  10. //入队列  
  11. void EnSQueue(SQueue &q, SQueueEle ele)  
  12. {  
  13.     if (q.rear >= MAXQUEUE)  
  14.         printf("队列满,不能进行入队操作!\n");  
  15.     else  
  16.         q.arrele[++q.rear] = ele;  
  17. }  
  18.   
  19. //出队列  
  20. void DeSQueue(SQueue &q, SQueueEle &ele)  
  21. {  
  22.     if (IsemptySQueue(q))  
  23.         printf("队列空,不能进行出队操作!\n");  
  24.     else  
  25.         ele = q.arrele[++q.front];  
  26. }  
  27.   
  28. //判断队列是否为空  
  29. bool IsemptySQueue(SQueue q)  
  30. {  
  31.     if (q.front == q.rear)  
  32.         return true;  
  33.     else  
  34.         return false;  
  35. }  
  36.   
  37. //获得队头元素值  
  38. SQueueEle GetFrontSQueue(SQueue q)  
  39. {  
  40.     if (IsemptySQueue(q))  
  41.         printf("队空,不能获得队头元素值!\n");  
  42.     else  
  43.         return q.arrele[q.front + 1];  
  44. }  

main.cpp 测试程序源文件

[cpp] view plain copy
  1. #include <stdio.h>  
  2. #include "SequentialStack.h"  
  3. #include "SequentialQueue.h"  
  4.   
  5. int main()  
  6. {  
  7.     /*顺序栈测试代码*/  
  8.     int ele;  
  9.     SStack s;  
  10.     InitSStack(s);  
  11.   
  12.     PushSStack(s, 0);  
  13.     PushSStack(s, 1);  
  14.     PushSStack(s, 2);  
  15.   
  16.     printf("栈顶元素值为:%d\n", GetTopSStack(s));  
  17.   
  18.     PopSStack(s, ele);  
  19.     printf("出栈第1个元素是:%d\n", ele);  
  20.   
  21.     printf("栈顶元素值为:%d\n", GetTopSStack(s));  
  22.   
  23.     PopSStack(s, ele);  
  24.     printf("出栈第2个元素是:%d\n", ele);  
  25.     PopSStack(s, ele);  
  26.     printf("出栈第3个元素是:%d\n", ele);  
  27.   
  28.     PopSStack(s, ele);  
  29.   
  30.     if (IsemptySStack(s))  
  31.         printf("栈为空!\n");  
  32.     putchar('\n');  
  33.     /*顺序队列测试代码*/  
  34.     SQueue q;  
  35.     InitSQueue(q);  
  36.   
  37.     EnSQueue(q, 0);  
  38.     EnSQueue(q, 1);  
  39.     EnSQueue(q, 2);  
  40.   
  41.     printf("队头元素值为:%d\n", GetFrontSQueue(q));  
  42.   
  43.     DeSQueue(q, ele);  
  44.     printf("出队第1个元素是:%d\n", ele);  
  45.   
  46.     printf("队头元素值为:%d\n", GetFrontSQueue(q));  
  47.   
  48.     DeSQueue(q, ele);  
  49.     printf("出队第2个元素是:%d\n", ele);  
  50.     DeSQueue(q, ele);  
  51.     printf("出队第3个元素是:%d\n", ele);  
  52.   
  53.     DeSQueue(q, ele);  
  54.   
  55.     if (IsemptySQueue(q))  
  56.         printf("队列为空!\n");  
  57.   
  58.     return 0;  
  59. }  

下面附测试结果图一张:

PS:个人测试没有问题,如果大家发现问题请及时联系,不胜感激!


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/384228.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用基本MVC2模式创建新闻网站

转载于:https://www.cnblogs.com/lr1402585172/p/10885084.html

栈(Stack),轻松解决数制转换和括号匹配问题!

http://data.biancheng.net/view/9.html 栈&#xff0c;线性表的一种特殊的存储结构。与学习过的线性表的不同之处在于栈只能从表的固定一端对数据进行插入和删除操作&#xff0c;另一端是封死的。 图1 栈结构示意图由于栈只有一边开口存取数据&#xff0c;称开口的那一端为“…

第一章 TCP/IP协议族

一、协议族体系结构 TCP/IP协议族分为四层协议系统&#xff0c;自底向下分别为数据链路层、网络层、传输层、应用层。 数据链路层常用ARP&#xff08;地址解析协议&#xff09;和RARP&#xff08;逆地址解析协议&#xff09;。在网络层使用IP寻址&#xff0c;而在数据链路层使用…

Linux多线程——使用信号量同步线程

http://blog.csdn.net/ljianhui/article/details/10813469/ 信号量、同步这些名词在进程间通信时就已经说过&#xff0c;在这里它们的意思是相同的&#xff0c;只不过是同步的对象不同而已。但是下面介绍的信号量的接口是用于线程的信号量&#xff0c;注意不要跟用于进程间通信…

C++11新特性之八——函数对象function

http://www.cnblogs.com/yyxt/p/3987717.html 详细请看《C Primer plus》(第六版中文版) http://www.cnblogs.com/lvpengms/archive/2011/02/21/1960078.html 备注&#xff1a; 函数对象&#xff1a; 尽管函数指针被广泛用于实现函数回调&#xff0c;但C还提供了一个重要的实现…

从零开始学C++之STL(八):函数对象、 函数对象与容器、函数对象与算法

http://blog.csdn.net/jnu_simba/article/details/9500219 一、函数对象 1、函数对象&#xff08;function object&#xff09;也称为仿函数&#xff08;functor&#xff09; 2、一个行为类似函数的对象&#xff0c;它可以没有参数&#xff0c;也可以带有若干参数。 3、任何重载…

树状数组初步理解

学习树状数组已经两周了&#xff0c;之前偷懒一直没有写&#xff0c;赶紧补上防止自己忘记&#xff08;虽然好像已经忘得差不多了&#xff09;。 作为一种经常处理区间问题的数据结构&#xff0c;它和线段树、分块一样&#xff0c;核心就是将区间分成许多个小区间然后通过对大区…

Linux socket编程(二) 服务器与客户端的通信

http://www.cnblogs.com/-Lei/archive/2012/09/04/2670964.html上一篇写了对套接字操作的封装&#xff0c;这一节使用已封装好的Socket类实现服务器与客户端的通信&#xff08;Socket的定义见上篇Socket.h) 服务器端&#xff1a; ServerSocket.h #ifndef SERVERSOCKET_H #defin…

UNIX网络编程:I/O复用技术(select、poll、epoll)

http://blog.csdn.net/dandelion_gong/article/details/51673085 Unix下可用的I/O模型一共有五种&#xff1a;阻塞I/O 、非阻塞I/O 、I/O复用 、信号驱动I/O 、异步I/O。此处我们主要介绍第三种I/O符复用。 I/O复用的功能&#xff1a;如果一个或多个I/O条件满足&#xff08;输…

解决iex -S mix报错

执行iex -S mix命令的时候会遇到如下错误&#xff1a; 执行 mix deps.get 然后就可以运行 iex -S mix了 其中&#xff0c;有可能会出现 按照其网站下载相应文件&#xff0c;复制到项目根目录下&#xff0c;然后执行命令&#xff08;mix local.rebar rebar ./rebar&#xff09;即…

Anker—工作学习笔记

http://www.cnblogs.com/Anker/archive/2013/08/17/3263780.html 1、基本知识 epoll是在2.6内核中提出的&#xff0c;是之前的select和poll的增强版本。相对于select和poll来说&#xff0c;epoll更加灵活&#xff0c;没有描述符限制。epoll使用一个文件描述符管理多个描述符&am…

Linux网络编程——tcp并发服务器(I/O复用之select

http://blog.csdn.net/lianghe_work/article/details/46519633 与多线程、多进程相比&#xff0c;I/O复用最大的优势是系统开销小&#xff0c;系统不需要建立新的进程或者线程&#xff0c;也不必维护这些线程和进程。 代码示例&#xff1a; [csharp] view plaincopy #include &…

Linux下的I/O复用与epoll详解

http://www.cnblogs.com/lojunren/p/3856290.html 前言 I/O多路复用有很多种实现。在linux上&#xff0c;2.4内核前主要是select和poll&#xff0c;自Linux 2.6内核正式引入epoll以来&#xff0c;epoll已经成为了目前实现高性能网络服务器的必备技术。尽管他们的使用方法不尽相…

数据结构--顺序栈和链式栈

http://www.cnblogs.com/jingliming/p/4602458.html 栈是一种限定只在表尾进行插入或删除操作,栈也是线性表表头称为栈的底部,表尾称为栈的顶部,表为空称为空栈&#xff0c;栈又称为后进先出的线性表,栈也有两种表示:顺序栈与链式栈顺序栈是利用一组地址连续的存储单元&#xf…

数据结构--双链表的创建和操作

http://www.cnblogs.com/jingliming/p/4602144.html#0-tsina-1-42616-397232819ff9a47a7b7e80a40613cfe1 一、双向链表的定义 双向链表也叫双链表&#xff0c;是链表的一种&#xff0c;它的每个数据结点中都有两个指针&#xff0c;分别指向直接后继和直接前驱。所以&#xff0c…

MYSQL错误代码#1045 Access denied for user 'root'@'localhost'

http://blog.csdn.net/lykezhan/article/details/70880845 遇到MYSQL“错误代码#1045 Access denied for user rootlocalhost (using password:YES)” 需要重置root账号权限密码&#xff0c;这个一般还真不好解决。 不过&#xff0c;这几天调试的时候真的遇到了这种问题&#x…

常量变量以及循环

常量 1.三目运算词 三字母词表达字符???([??)]??<{??>} 2.循环 1).数组元素以及变量在内存中的分配顺序 2)goto语句应用 //电脑关机程序 #include<stdio.h> #include <stdlib.h> #include <string.h> #include <windows.h> int ma…

Linux 环境 C语言 操作MySql 的接口范例

http://www.cnblogs.com/wunaozai/p/3876134.html 接上一小节&#xff0c;本来是计划这一节用来讲数据库的增删改查&#xff0c;但是在实现的过程中&#xff0c;出现了一点小问题&#xff0c;也不是技术的问题&#xff0c;就是在字符界面上比较不好操作。比如要注册一个帐号&a…

数组相关运算

数组的初始化 数组及指针在内存中的存储 一维数组在内存中的存储 有关数组的运算 //一维数组 int a[] {1,2,3,4}; printf("%d\n",sizeof(a));//16这里的a表示的是整个数组,计算出的是整个数组的大小,单位为byte printf("%d\n",sizeof(a 0));/*a没有单独…

gets fgets 区别

http://www.cnblogs.com/aexin/p/3908003.html 1. gets与fgets gets函数原型&#xff1a;char*gets(char*buffer);//读取字符到数组&#xff1a;gets(str);str为数组名。 gets函数功能&#xff1a;从键盘上输入字符&#xff0c;直至接受到换行符或EOF时停止&#xff0c;并将读取…