(C語言版)棧和隊列(二)——實現順序存儲棧和順序存儲隊列的相關操作

        棧和隊列都有兩種實現方式,一種在之前已經寫過了,是鏈式存儲形式,另一種是順序存儲形式。也就是這裏所寫的用數組的形式實現,和鏈式存儲形式相比,有幾個不同的地方。

  1. 順序存儲的方式,必須確定棧和隊列的大小,也就是要確定數組的大小。而鏈式儲存是動態分配的,根據需要來增減。
  2. 順序存儲的方式有溢出的現象,由於是數組存儲,所以超出數組下標的時候就溢出了。

        下面上代碼:

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:個人測試沒有問題,如果大家發現問題請及時聯繫,不勝感激!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章