数据结构-线性表-栈【顺序栈】

# include 
# include 
# include 
# include "define.h"
/*
时间:2023年8月2日19:47:52
目的:研究顺序栈
栈:是一个操作受限的线性表 只能够后进先出(LIFO)
    限定在表尾(也叫栈顶)进行删除和插入操作
作者:wHappy
*/

//顺序栈-----------------------------------------

#ifndef _STACK_H
#define _STACK_H

//栈的类型定义
#define MAXSATCK 100 //数组最大空间
typedef int StackElemType; //栈的数据类型
typedef struct _SqStack  //顺序栈的结点类型
{
	StackElemType* base; //指向栈底的指针
	StackElemType* top; //指向栈顶的指针
	int stacksize; //表示栈的最大容量
} SqStack; //普通变量SqStack表示这个数据类型

//顺序栈的基本操作
Status InitStack(SqStack* S); //初始化
Status Push(SqStack* S, StackElemType e);//入栈
Status Pop(SqStack* S, StackElemType *e);//出栈
Status Is_Empty(SqStack* S); //判空
Status Is_Full(SqStack* S); //判满
StackElemType Get_Top(SqStack* S); //获取栈顶元素
Status Stack_Length(SqStack* S); //栈长度
Status ClearStack(SqStack* S); //清空
Status DestroyStack(SqStack* S); //销毁

int main(void)
{
	SqStack S;
	int length;
	InitStack(&S); //初始化
	Push(&S,1);
	Push(&S,2);
	Push(&S,3);
	Push(&S,4);

	//if(Is_Full(&S))
		//printf("满!\n");

	//if(ClearStack(&S))
	//	printf("栈已清空!\n");

	 // if(DestroyStack(&S))
	//	  printf("栈已销毁!\n");

    //length=Stack_Length(&S);
	//printf("len = %d\n",length);
	
	while(!Is_Empty(&S))
	{
		StackElemType e;
		Pop(&S,&e);
		printf("%d \n",e);
		
	}
	
	
	return 0;
}

Status InitStack(SqStack* S) //初始化
{
	S->base = (StackElemType* )malloc(sizeof(StackElemType) * MAXSATCK);//base指向第一个元素
	if(!S->base) //分配不成功返回错误
		return ERROR;
	S->top = S->base; //分配成功,base和top都指向栈底
	S->stacksize = MAXSATCK; //设置栈的最大容量为 MAXSTACK
	return OK;
}

Status Push(SqStack* S, StackElemType e)//入栈
{
/*
1.判断栈是否已满
2.元素e压入栈顶
3.栈顶指针加1
	*/
	if(S->top - S->base == S->stacksize)
		return ERROR; //表示栈满
	*(S->top++) = e; //入栈

	return OK;
}

Status Pop(SqStack* S, StackElemType *e)//出栈
{
	if(S->base == S->top)
		return ERROR; //栈空
	*e = *(--(S->top)); //出栈
	return OK;
		
}

Status Is_Empty(SqStack* S) //判空
{
	if(S->base == S->top)
		return TRUE;
	else
		return FALSE;
}

Status Is_Full(SqStack* S) //判满
{
	if(S->top - S->base == S->stacksize)
		return TRUE;
	else
		return FALSE;
}
StackElemType Get_Top(SqStack* S) //获取栈顶元素
{
	if(!Is_Empty(S))
		return *(S->top - 1); //top指向栈顶后面一个结点
}
Status Stack_Length(SqStack* S) //栈长度
{
	return S->top - S->base;
}

Status ClearStack(SqStack* S) //清空
{
	if(S->base)
		S->top = S->base;
	return OK;
}
Status DestroyStack(SqStack *S) //销毁
{
	if(S->base)
	{
		free(S->base);
		S->stacksize = 0;
		S->base = S->top = NULL;
	}
	return OK;

}

#endif

你可能感兴趣的:(数据结构,c++,链表,算法,c语言)