数据结构严蔚敏 栈基本操作 C语言实现

【数据结构严蔚敏】 第三章 栈基本操作C语言实现

注意部分:

1.*S.top++ = e;= *S=e ; S.top++ ;
若要实现指针所指地址的元素值++,语句应该是(*a)++而不是*a++
2.关于指针
普通变量如 int a,&a表示变量a所在地址,a表示a所在地址中存储的值
指针变量如 int * a ,a表示a中存储的一个int型变量的地址,*a表示在a存储的地址中存储的值 ,&a依然表示该指针所在地址(不是a中存储的地址),。
2.关于free的问题
free与malloc语句对应,作用于指针,malloc为指针分配专用内存空间,使用free语句后,该内存空间不再为指针专有,它可能会被再次利用,但是指针所指仍然是这个地址,依然能够进行操作,所以在free后需要对指针置为NULL,防止误操作指针出现意外情况。
free(p);p=NULL;配合使用

代码部分

vs2017

stack.h部分

#include
#include
#include
using namespace std;
#define TRUE	1
#define FALSE	0
#define	OK		1
#define ERROR	0
#define	INFEASLBLE	-1
#define STACK_INIT_SIZE 100 //存储空间初始分配量
#define STACKINCREMENT 10  //存储空间分配增量

typedef int Status;
typedef int SElemType;

typedef struct{
	SElemType * base;
	SElemType * top;
	int stacksize;
}SqStack;

//构造一个空栈
Status InitStack(SqStack &S);

//销毁一个栈
Status DestroyStack(SqStack &S);

//清空一个栈
Status ClearStack(SqStack &S);

//若栈为空栈,则返回TRUE,否则返回FALSE
Status StackEmpty(SqStack &S);

//返回S的元素个数,即栈的长度
int StackLength(SqStack S);

//若栈不空,用e返回S的栈顶元素,并返回OK;否则返回ERROR
Status GeTop(SqStack S, SElemType &e);

//插入元素e为新的栈顶元素
Status Push(SqStack &S, SElemType &e);

//若栈不空,删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
Status Pop(SqStack &S, SElemType e);

//从栈底到栈顶依次对栈中每个元素调用函数visit()。一旦visit失败,操作失败
Status StackTraverse(SqStack S, Status(*visit)(SElemType*));

stack.c部分

#include "stack.h"

Status 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;
	return OK;
}

Status DestroyStack(SqStack & S)
{
	free(S.base);
	S.base = NULL;		//free后需要将指针赋NULL,否则可能造成问题
	S.stacksize = 0;
	return OK;
}

Status ClearStack(SqStack & S)
{
	S.top = S.base;
	return OK;
}

Status StackEmpty(SqStack & S)
{
	if (S.base == S.top)return TRUE;
	return FALSE;
}

int StackLength(SqStack S)
{
	return S.top-S.base;
}

Status GeTop(SqStack S, SElemType & e)
{	
	if (S.top == S.base) return ERROR;
	e = *(S.top - 1);
	return OK;
	
}

Status Push(SqStack & S, SElemType e)
{
	if (S.top - S.base >= S.stacksize) {
		S.base = (SElemType *)realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(SElemType));

		if (!S.base)exit(OVERFLOW);
		S.top = S.base + S.stacksize;
		S.stacksize += STACKINCREMENT;
	}
	*S.top++ = e;
	return	OK;

}

Status Pop(SqStack & S, SElemType &e)
{
	if (S.base == S.top)return ERROR;
	e = *--S.top;
	return OK;
}

Status StackTraverse(SqStack S, Status(*visit)(SElemType*))
{
	SElemType *cur;
	cur = S.base;
	while (!(cur == S.top)) {
		if (!visit(cur)) return ERROR; 
		cur++;

	}
	return OK;
}

test部分

#include
#include
#include
#include"stack.h"

int visit(SElemType* cur) {
	//显示元素值
	cout << *cur;
	return OK;
}
int main() {
	SqStack S;
	int e=0;
	InitStack(S);	//初始化链表
	for (int i = 0; i < 5; i++) {  //圧入五个元素
		Push(S, i);
	}

	StackTraverse(S, visit);	   //遍历栈,visit定义为输出函数。

	cout <<endl<< "删除栈顶元素" << endl;
	Pop(S, e);					   //删除栈顶元素

	StackTraverse(S, visit);

	cout << endl << "输出栈的元素个数" << endl;
	cout << StackLength(S)<<endl;	//输出栈的元素个数

	cout << "清空栈" << endl;
	ClearStack(S);

	cout << "判断栈是否为空,1为空" << endl;
	cout << StackEmpty(S)<<endl;

	system("pause");

	return 0;
}

输出结果
数据结构严蔚敏 栈基本操作 C语言实现_第1张图片

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