数据结构——顺序栈算法和基本操作

本次是采用大程序结构,涉及多个代码段

1.ci.h——包括一些头文件和预定义

//c1.h
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//函数结果状态码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int Status;
typedef int Boolean;

2.c3-1.h——顺序栈的存储结构

//c3-1.h
typedef int SElemType;
#define STACK_INIT_SIZE 10		//存储空间初始分配量
#define STACK_INCREMENT 2		//存储空间分配增量
struct SqStack
{
	SElemType *base;
	SElemType *top;
	int stacksize;
};

3.bo3-1——基本操作函数

void InitStack(SqStack &S)
//构建一个空栈并初始化
{
	S.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
	if (!S.base)
		exit(OVERFLOW);
	S.top = S.base;						//栈顶指向栈底,空栈
	S.stacksize = STACK_INIT_SIZE;		//存储空间为初始分配量
}

void DestroyStack(SqStack &S)
//销毁栈
{
	free(S.base);
	S.top = S.base = NULL;				//栈顶、栈底指针均为空
	S.stacksize = 0;					//当前已分配存储空间为0
}

void ClearStack(SqStack &S)
//把栈清空
{
	S.top = S.base;						//栈顶指针指向栈底
}

Status StackEmpty(SqStack S)
//判断栈空
{
	if (S.top == S.base)				//空栈条件
		return TRUE;
	else
		return FALSE;
}

int StackLength(SqStack S)
//返回栈元素个数,即栈的长度
{
	return S.top - S.base;
}

Status GetTop(SqStack S, SElemType &e)
//获取栈顶元素
{
	if (S.top > S.base)
	{
		e = *(S.top - 1);
		return OK;
	}
	else
		return ERROR;
}

void Push(SqStack &S, SElemType e)
//压栈, 插入元素为e的新的栈顶元素
{
	if (S.top - S.base == S.stacksize)			//栈满,追加空间
	{
		S.base = (SElemType *)realloc(S.base, (S.stacksize + STACK_INCREMENT) * sizeof(SElemType));
		if (!S.base)
			exit(OVERFLOW);
		S.top = S.base + S.stacksize;			//修改栈顶指针,指向新的栈顶
		S.stacksize += STACK_INCREMENT;			//更新当前已分配的存储空间
	}
	*(S.top++) = e;		//e入栈,成为新的栈顶元素,栈顶指针上移
}

Status Pop(SqStack &S, SElemType &e)
{
	if (S.top == S.base)
		return ERROR;
	e = *--S.top;		//栈顶指针下移一个存储单元, 将栈顶元素赋值给e
	return OK;
}

void StackTraverse(SqStack S, void(*visit)(SElemType))
//从栈底到栈顶依次对栈中每个元素调用visit()
{
	SElemType *p = S.base;
	while (S.top > p)
	{
		visit(*p++);		//调用visit(),p指针上移一个存储单元
	}
	printf("\n");
}

4.func2-2.h——功能函数

//func2-2 几个常用函数
#define ElemType SElemType

Status equal(ElemType c1, ElemType c2)
//判断是否相等
{
	if (c1 == c2)
		return true;
	else
		return false;
}

int comp(ElemType a, ElemType b)
//根据a<,=,>b,分别返回-1,0,1
{
	if (a == b)
		return 0;
	else
		return (a - b) / abs(a - b);
}

void print(ElemType c)
//十进制输出
{
	printf("%d ", c);
}

void print1(ElemType &c)
//十进制输出(引用类型)
{
	printf("%d ", c);
}

void print2(ElemType c)
//以字符格式输出
{
	printf("%c ", c);
}

5.主函数

#include"c1.h"
#include"c3-1.h"
#include"bo3-1.h"
#include"func2-2.h"

int main()
{
	int j;
	SqStack s;
	SElemType e;
	InitStack(s);
	for (j = 1; j <= 12; j++)
	{
		Push(s, j);
	}
	printf("栈中元素依次为: ");
	StackTraverse(s, print);
	Pop(s, e);
	printf("弹出的栈顶元素e = %d\n", e);
	printf("栈空否? %d (1:空,0:否)\n", StackEmpty(s));
	GetTop(s, e);
	printf("栈顶元素e = %d, 栈的长度为%d\n", e, StackLength(s));
	ClearStack(s);
	printf("清空栈后,栈空否? %d (1:空,0:否)\n", StackEmpty(s));
	DestroyStack(s);
	printf("销毁栈后,s.top = %p, s.base = %p, s.stacksize = %d\n", s.top, s.base, s.stacksize);

	return 0;
}

你可能感兴趣的:(数据结构)