1. 程式人生 > >資料結構---線性表(順序棧)

資料結構---線性表(順序棧)

SqStack.h

#ifndef __SQSTACK_H__
#define __SQSTACK_H__

//一些庫函式的標頭檔案包含
#include <string.h>
#include <ctype.h>
#include <malloc.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <io.h>
#include <math.h>
 
//自定義bool
typedef int Boolean;
 
//定義函式返回狀態
typedef int Status;
 
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0

#define STACK_SIZE 10
#define STACK_INCREAMENT 5

typedef struct sqstack
{
	int *base;
	int *top;
	int len;
}SQSTACK,*PSQSTACK;

/* 初始化 */
Status init(PSQSTACK ps);

/* 銷燬 */
Status destroy(PSQSTACK ps);

/* 重置 */
Status clear(PSQSTACK ps);

/* 判空 */
Boolean isEmpty(SQSTACK s);

/* 獲取已存元素的數量 */
int listLen(SQSTACK s);

/* 獲取棧頂元素 */
Status getTop(SQSTACK s,int *elem);

/* 入棧元素 */
Status push(PSQSTACK ps, int elem);

/* 出棧元素 */
int pop(PSQSTACK ps, int *elem);

/* 瀏覽棧中值 */
Status traverse(SQSTACK s, void (*vi)(int *));

#endif

SqStack.c

#include "SqStack.h"

/* 初始化 */
Status init(PSQSTACK ps)
{
	ps->base = (int *)malloc(sizeof(int) * STACK_SIZE);
	if(!ps->base)
	{
		printf("動態記憶體分配失敗");
		exit(-1);
	}

	ps->top = ps->base;
	ps->len = STACK_SIZE;
	return OK;
}

/* 銷燬 */
Status destroy(PSQSTACK ps)
{
	free(ps->base);
	ps->base = NULL;
	ps->top = NULL;
	ps->len = 0;

	return OK;
}

/* 重置 */
Status clear(PSQSTACK ps)
{
	ps->top = ps->base;
}

/* 判空 */
Boolean isEmpty(SQSTACK s)
{
	if(s.base == s.top)
	{
		return TRUE;
	}
	else
	{
		return FALSE;
	}
}

/* 獲取已存元素的數量 */
int listLen(SQSTACK s)
{
	return s.top - s.base;
}

/* 獲取棧頂元素 */
Status getTop(SQSTACK s,int *elem)
{
	*elem = *(s.top-1);
	return OK;
}

/* 入棧元素 */
Status push(PSQSTACK ps, int elem)
{
	//判斷棧是否滿
	if(ps->top - ps->base >= ps->len)
	{
		ps->base = (int *)realloc(ps->base, sizeof(int)*(ps->len + STACK_INCREAMENT) );
		if(!ps->base)
		{
			printf("動態記憶體分配失敗");
			exit(-1);
		}

		ps->top = ps->base + ps->len;
		ps->len += STACK_INCREAMENT;
	}

	*(ps->top++) = elem;

    return OK;
}

/* 出棧元素 */
int pop(PSQSTACK ps, int* elem)
{
	if(ps->base == ps->top)
	{
		return ERROR;
	}

	*elem = *(--ps->top);

	return OK;
}

/* 瀏覽棧中值 */
Status traverse(SQSTACK s, void (*vi)(int *))
{
	while(s.base != s.top)
	{
		vi(--s.top);
	}
    return OK;
}