本文主要是介绍(C语言版)栈和队列(二)——实现顺序存储栈和顺序存储队列的相关操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
http://blog.csdn.net/fisherwan/article/details/21479649
栈和队列都有两种实现方式,一种在之前已经写过了,是链式存储形式,另一种是顺序存储形式。也就是这里所写的用数组的形式实现,和链式存储形式相比,有几个不同的地方。
- 顺序存储的方式,必须确定栈和队列的大小,也就是要确定数组的大小。而链式储存是动态分配的,根据需要来增减。
- 顺序存储的方式有溢出的现象,由于是数组存储,所以超出数组下标的时候就溢出了。
下面上代码:
SequentialStack.h 顺序存储栈头文件
- #ifndef _SEQUENTIALSTACK_H_H
- #define _SEQUENTIALSTACK_H_H
-
- typedef int SStackEle;
- const int MAXSTACK = 20;
-
- typedef struct SSTACK
- {
- SStackEle arrele[MAXSTACK];
- SStackEle top;
- }SStack;
-
-
- void InitSStack(SStack &s);
-
-
- void PushSStack(SStack &s, SStackEle ele);
-
-
- void PopSStack(SStack &s, SStackEle &ele);
-
-
- bool IsemptySStack(SStack s);
-
-
- SStackEle GetTopSStack(SStack s);
-
- #endif
SequentialQueue.h
顺序存储队列头文件
- #ifndef _SEQUENTIALQUEUE_H_H
- #define _SEQUENTIALQUEUE_H_H
-
- typedef int SQueueEle;
- const int MAXQUEUE = 10;
-
- typedef struct SQUEUE
- {
- SQueueEle arrele[MAXQUEUE];
- SQueueEle front, rear;
- }SQueue;
-
-
- void InitSQueue(SQueue &q);
-
-
- void EnSQueue(SQueue &q, SQueueEle ele);
-
-
- void DeSQueue(SQueue &q, SQueueEle &ele);
-
-
- bool IsemptySQueue(SQueue q);
-
-
- SQueueEle GetFrontSQueue(SQueue q);
-
- #endif
SequentialStack.cpp
顺序存储栈源文件
- #include "SequentialStack.h"
- #include <stdio.h>
-
-
- void InitSStack(SStack &s)
- {
- s.top = -1;
- }
-
-
- void PushSStack(SStack &s, SStackEle ele)
- {
- s.top++;
- if (s.top < MAXSTACK)
- s.arrele[s.top] = ele;
- else
- printf("栈满,不能进行压入操作!\n");
- }
-
-
- void PopSStack(SStack &s, SStackEle &ele)
- {
- if (s.top < 0)
- printf("栈空,不能进行出栈操作!\n");
- else
- {
- ele = s.arrele[s.top];
- s.top--;
- }
- }
-
-
- bool IsemptySStack(SStack s)
- {
- if (s.top = -1)
- return true;
- else
- return false;
- }
-
-
- SStackEle GetTopSStack(SStack s)
- {
- if (s.top < 0)
- printf("栈空,不能获得栈顶元素值!\n");
- else
- return s.arrele[s.top];
- }
SequentialQueue.cpp
顺序存储队列源文件
- #include "SequentialQueue.h"
- #include <stdio.h>
-
-
- void InitSQueue(SQueue &q)
- {
- q.front = q.rear = -1;
- }
-
-
- void EnSQueue(SQueue &q, SQueueEle ele)
- {
- if (q.rear >= MAXQUEUE)
- printf("队列满,不能进行入队操作!\n");
- else
- q.arrele[++q.rear] = ele;
- }
-
-
- void DeSQueue(SQueue &q, SQueueEle &ele)
- {
- if (IsemptySQueue(q))
- printf("队列空,不能进行出队操作!\n");
- else
- ele = q.arrele[++q.front];
- }
-
-
- bool IsemptySQueue(SQueue q)
- {
- if (q.front == q.rear)
- return true;
- else
- return false;
- }
-
-
- SQueueEle GetFrontSQueue(SQueue q)
- {
- if (IsemptySQueue(q))
- printf("队空,不能获得队头元素值!\n");
- else
- return q.arrele[q.front + 1];
- }
main.cpp
测试程序源文件
- #include <stdio.h>
- #include "SequentialStack.h"
- #include "SequentialQueue.h"
-
- int main()
- {
-
- int ele;
- SStack s;
- InitSStack(s);
-
- PushSStack(s, 0);
- PushSStack(s, 1);
- PushSStack(s, 2);
-
- printf("栈顶元素值为:%d\n", GetTopSStack(s));
-
- PopSStack(s, ele);
- printf("出栈第1个元素是:%d\n", ele);
-
- printf("栈顶元素值为:%d\n", GetTopSStack(s));
-
- PopSStack(s, ele);
- printf("出栈第2个元素是:%d\n", ele);
- PopSStack(s, ele);
- printf("出栈第3个元素是:%d\n", ele);
-
- PopSStack(s, ele);
-
- if (IsemptySStack(s))
- printf("栈为空!\n");
- putchar('\n');
-
- SQueue q;
- InitSQueue(q);
-
- EnSQueue(q, 0);
- EnSQueue(q, 1);
- EnSQueue(q, 2);
-
- printf("队头元素值为:%d\n", GetFrontSQueue(q));
-
- DeSQueue(q, ele);
- printf("出队第1个元素是:%d\n", ele);
-
- printf("队头元素值为:%d\n", GetFrontSQueue(q));
-
- DeSQueue(q, ele);
- printf("出队第2个元素是:%d\n", ele);
- DeSQueue(q, ele);
- printf("出队第3个元素是:%d\n", ele);
-
- DeSQueue(q, ele);
-
- if (IsemptySQueue(q))
- printf("队列为空!\n");
-
- return 0;
- }
下面附测试结果图一张:

PS:个人测试没有问题,如果大家发现问题请及时联系,不胜感激!
这篇关于(C语言版)栈和队列(二)——实现顺序存储栈和顺序存储队列的相关操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!