【数据结构-栈】C语言实现顺序栈基本操作

C语言实现顺序栈基本操作

  • 基本操作
      • 顺序栈储存结构
      • 初始化顺序栈
      • 判断顺序栈是否为空
      • 顺序栈的长度
      • 清空顺序栈
      • 销毁顺序栈
      • 压栈n个元素
      • 入栈
      • 出栈
      • 遍历
      • 测试代码整合

基本操作

【数据结构-栈】C语言实现顺序栈基本操作_第1张图片

顺序栈储存结构

//定义顺序栈存储结构
typedef struct
{
	int *top;  //栈顶指针 
	int *base;   //栈底指针 
	int stacksize;    //顺序栈最大容量 
} SqStack;

初始化顺序栈

//初始化顺序栈
Status InitStack(SqStack *s)
{
	(*s).base = (SElemType *)malloc(MAXSIZE);   //动态创建一个内存空间单元,容量为MAXSIZE 
	if(!(*s).base) return ERROR;   //动态创建空间单元失败返回ERROR 
	(*s).top = (*s).base;    //栈顶指针指向栈底指针 
	(*s).stacksize = MAXSIZE;     
	return OK;	
}

判断顺序栈是否为空

//判断顺序栈是否为空
Status isEmpty(SqStack s)
{
	if(s.base == s.top) return TRUE;   //栈顶和栈底相同  空 
	return FALSE;   //非空 
}

顺序栈的长度

//求顺序栈长度
int StackLength(SqStack s)
{
	return s.top-s.base;    //栈顶指针减去栈底指针 
}

清空顺序栈

//清空顺序栈
Status clearStack(SqStack *s)
{
	if((*s).base == NULL) return ERROR;    //顺序栈不存在返回ERROR 
	(*s).top = (*s).base;     //栈顶指针指向栈底 
	return OK;
} 

销毁顺序栈

//销毁顺序栈
Status destroyStack(SqStack *s)
{
	if((*s).base == NULL) return ERROR;
	free((*s).base);   //释放栈底指针所指向的内存单元 
	(*s).stacksize = 0;      //顺序栈最大容量设置为0 
	(*s).base = (*s).top = NULL;    //栈底和栈顶都设置NULL 
	return OK; 
}

压栈n个元素

//为顺序栈 压栈n个元素
Status pushElems(SqStack *s,int n)
{
	int i;
	if((*s).base == NULL) return ERROR;   //顺序栈不存在返回ERROR 
	if(((*s).top - (*s).base) == (*s).stacksize) return ERROR;    //顺序栈满栈返回ERROR 
	printf("请输入压栈的%d个元素: ",n);
	for(i=0;i<n;i++)
	{
		scanf("%d",(*s).top);        //栈顶指针指向的内存单元输入数据 
		(*s).top++;       //栈顶指针指向下一个栈 
	}
	return OK;
} 

入栈

//入栈
Status push(SqStack *s,SElemType e)
{
	if((*s).base == (*s).MAXSIZE) return ERROR; 
	*((*s).top)++=e;  //栈顶指针先赋值自加 
	return OK;
 } 

出栈

 //出栈
Status pop(SqStack *s,SElemType *e)
{
	if((*s).base == (*s).top) return ERROR;
	*e = *-- (*s).top;   //栈顶指针先自减再取值,最后赋值 
	return OK;
}

遍历

//遍历
void show(SqStack s)
{
	printf("当前顺序栈情况: ");
	for(s.top = s.top-1;s.top>=s.base;s.top--)
		printf("%d ",*(s.top));
	printf("\n"); 
 } 

测试代码整合

#include 
#include 

#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define TRUE 1
#define FALSE 0 
#define MAXSIZE 100

typedef int SElemType;
typedef int Status; 
//定义顺序栈存储结构
typedef struct
{
	int *top;  //栈顶指针 
	int *base;   //栈底指针 
	int stacksize;    //顺序栈最大容量 
} SqStack;

//初始化顺序栈
Status InitStack(SqStack *s)
{
	(*s).base = (SElemType *)malloc(MAXSIZE);   //动态创建一个内存空间单元,容量为MAXSIZE 
	if(!(*s).base) return ERROR;   //动态创建空间单元失败返回ERROR 
	(*s).top = (*s).base;    //栈顶指针指向栈底指针 
	(*s).stacksize = MAXSIZE;     
	return OK;	
}

//为顺序栈 压栈n个元素
Status pushElems(SqStack *s,int n)
{
	int i;
	if((*s).base == NULL) return ERROR;   //顺序栈不存在返回ERROR 
	if(((*s).top - (*s).base) == (*s).stacksize) return ERROR;    //顺序栈满栈返回ERROR 
	printf("请输入压栈的%d个元素: ",n);
	for(i=0;i<n;i++)
	{
		scanf("%d",(*s).top);        //栈顶指针指向的内存单元输入数据 
		(*s).top++;       //栈顶指针指向下一个栈 
	}
	return OK;
} 

//判断顺序栈是否为空
Status isEmpty(SqStack s)
{
	if(s.base == s.top) return TRUE;   //栈顶和栈底相同  空 
	return FALSE;   //非空 
}

//清空顺序栈
Status clearStack(SqStack *s)
{
	if((*s).base == NULL) return ERROR;    //顺序栈不存在返回ERROR 
	(*s).top = (*s).base;     //栈顶指针指向栈底 
	return OK;
} 

//销毁顺序栈
Status destroyStack(SqStack *s)
{
	if((*s).base == NULL) return ERROR;
	free((*s).base);   //释放栈底指针所指向的内存单元 
	(*s).stacksize = 0;      //顺序栈最大容量设置为0 
	(*s).base = (*s).top = NULL;    //栈底和栈顶都设置NULL 
	return OK; 
}

//求顺序栈长度
int StackLength(SqStack s)
{
	return s.top-s.base;    //栈顶指针减去栈底指针 
}

//入栈
Status push(SqStack *s,SElemType e)
{
	if((*s).base == (*s).MAXSIZE) return ERROR; 
	*((*s).top)++=e;  //栈顶指针先赋值自加 
	return OK;
 } 
 
//出栈
Status pop(SqStack *s,SElemType *e)
{
	if((*s).base == (*s).top) return ERROR;
	*e = *-- (*s).top;   //栈顶指针先自减再取值,最后赋值 
	return OK;
}

//遍历
void show(SqStack s)
{
	printf("当前顺序栈情况: ");
	for(s.top = s.top-1;s.top>=s.base;s.top--)
		printf("%d ",*(s.top));
	printf("\n"); 
 } 

int main()
{
	SqStack S;
	SElemType e;
	InitStack(&S);
	printf("-------为初始化的栈压入数据-------\n"); 
	pushElems(&S,5);
	show(S);
	printf("\n-------顺序栈是否为空?---------\n");
	if(isEmpty(S)) printf("空栈\n");
	else printf("非空栈\n");  
	printf("\n-------顺序栈的长度--------\n顺序栈的长度:%d\n",StackLength(S));
	printf("\n-------顺序栈入栈-----------\n");
	push(&S,10); 
	show(S);
	printf("\n-------顺序栈出栈-----------\n");
	pop(&S,&e);
	printf("出栈元素:%d\n",e);
	show(S);
	
	printf("\n-------清空顺序栈----------\n");
	clearStack(&S); 
	if(isEmpty(S)) printf("空栈\n");
	else printf("非空栈\n"); 
		
	printf("\n-------销毁顺序栈----------\n");
	destroyStack(&S);
	if(!S.base) printf("栈不存在~\n");
}

你可能感兴趣的:(数据结构,C语言,数据结构,栈,指针)