1. 程式人生 > >C語言實現棧和佇列(棧和佇列的基本操作)

C語言實現棧和佇列(棧和佇列的基本操作)

棧:

棧:棧(stack)又名堆疊,它是一種運算受限的線性表。其限制是僅允許在表的一端進行插入和刪除運算。這一端被稱為棧頂,相對地,把另一端稱為棧底

特點:先進後出

stack.h

#pragma once
#include <stdio.h>
#include <malloc.h>
#include <assert.h>
#include <string.h>

//
//typedef int DataType;
//
//#define N 10
//typedef struct Stack
//{
//	DataType _a[N];
//	int _top; // 棧頂
//}Stack;


typedef int DataType;
#define N 10
typedef struct Stack
{
	DataType* _a;
	int _top;		// 棧頂
	int _capacity;  // 容量 
}Stack;

void StackInit(Stack* ps);
void StackDestory(Stack* ps);

void StackPush(Stack* ps, DataType x);
void StackPop(Stack* ps);
DataType StackTop(Stack* ps);
int StackEmpty(Stack* ps);
int StackSize(Stack* ps);

void TestStack();

stack.c

#include "Stack.h"

void StackInit(Stack* ps)
{
	assert(ps);
	ps->_a = (DataType*)malloc(sizeof(DataType)*N);
	ps->_top = 0;
	ps->_capacity = N;
}

void StackDestory(Stack* ps)
{
	assert(ps);
	ps->_a = NULL;
	ps->_top = 0;
	ps->_capacity = 0;
	free(ps);
	ps = NULL;
}
void StackPush(Stack* ps, DataType x)
{
	DataType* cur;
	assert(ps);
	if (ps->_top == ps->_capacity)
	{
		cur = (DataType*)realloc(ps->_a, sizeof(DataType) * 2 * ps->_capacity);
		if (cur != NULL)
		{
			ps->_a = cur;
		}
		ps->_capacity = 2 * ps->_capacity;
	}
	ps->_a[ps->_top] = x;
	ps->_top++;
}
void StackPop(Stack* ps)
{
	assert(ps);
	assert(ps->_top > 0);
	ps->_top--;

}


DataType StackTop(Stack* ps)
{
	assert(ps);
	assert(ps->_top > 0);
	return ps->_a[ps->_top - 1];
}


int StackEmpty(Stack* ps)//空0 非空1
{
	assert(ps);
	return ps->_top == 0 ? 0 : 1;
}

int StackSize(Stack* ps)
{
	assert(ps);
	return ps->_top;
}

佇列:

佇列(queue)是一種特殊的線性表,特殊之處在於它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作,和棧一樣,佇列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。

特點:先進先出

Queue.h

#pragma once

#include <stdio.h>
#include <malloc.h>
#include <assert.h>
#include<stdlib.h>

typedef int DataType;

typedef struct QueueNode
{
	struct QueueNode* _next;
	DataType _data;
}QueueNode;

typedef struct Queue
{
	QueueNode* _front; // 隊頭
	QueueNode* _back;  // 隊尾
}Queue;

void QueueInit(Queue* pq);
void QueueDestory(Queue* pq);

QueueNode* BuyQueueNode(DataType x);
void QueuePush(Queue* pq, DataType x);
void QueuePop(Queue* pq);
DataType QueueFront(Queue* pq);
int QueueEmpty(Queue* pq);

int QueueSize(Queue* pq);

Queue.c

#include "Queue.h"

void QueueInit(Queue* pq)
{
	assert(pq);
	pq->_front = NULL;
	pq->_back = NULL;
		
}
void QueueDestory(Queue* pq)
{
	assert(pq);
	QueueNode*cur = pq->_front;
	while (cur)
	{
		QueueNode*tmp = cur->_next;
		free(cur);
		cur = tmp;
	}
	pq->_front = pq->_back = NULL;
}
QueueNode* BuyQueueNode(DataType x)
{
	QueueNode*tmp = (QueueNode*)malloc(sizeof(QueueNode));
	if (tmp == NULL)
	{
		perror("use malloc");
	}
	tmp->_next = NULL;
	tmp->_data = x;
	return tmp;

}
void QueuePush(Queue* pq, DataType x)
{
	assert(pq);
	if (pq->_front == NULL)
	{
		QueueNode*next = BuyQueueNode(x);
		pq->_front = next;
		pq->_back = next;
	}
	else
	{
		QueueNode*next = BuyQueueNode(x);
		pq->_back->_next = next;
		pq->_back = next;
	}
}
void QueuePop(Queue* pq)
{
	assert(pq);
	QueueNode*next = pq->_front->_next;
	free(pq->_front);
	pq->_front = next;
}
DataType QueueFront(Queue* pq)
{
	assert(pq);
	return pq->_front->_data;
}
int QueueEmpty(Queue* pq)////空返回0,非空返回1
{
	assert(pq);
	return pq->_front == NULL ? 0 : 1;

}

int QueueSize(Queue* pq)
{
	int size = 0;
	assert(pq);
	QueueNode*cur = pq->_front;
	while (cur)
	{
		size++;
		cur = cur->_next;
	}
	return size;
}


下面是棧和佇列的測試函式(test.c)

#include"Stack.h"
#include"Queue.h"
void test1()
{
	Stack s;
	StackInit(&s);
	StackPush(&s, 1);
	StackPush(&s, 2);
	StackPush(&s, 3);
	StackPush(&s, 4);
	StackPush(&s, 5);
	while (StackEmpty(&s) != 0)
	{
		printf("%d ", StackTop(&s));
		StackPop(&s);
	}
	printf("\n");
}
void test2()
{
	Queue s;
	QueueInit(&s);
	QueuePush(&s, 1);
	QueuePush(&s, 2);
	QueuePush(&s, 3);
	QueuePush(&s, 4);
	QueuePush(&s, 5);
	while (	QueueEmpty(&s) != 0)
	{
		printf("%d ", QueueFront(&s));
		QueuePop(&s);
	}
}

int main()
{
	test1();
	test2();
	return 0;
}

執行結果如下