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

基本操作

在这里插入图片描述

顺序栈储存结构

//定义顺序栈存储结构
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 <stdio.h>
#include <stdlib.h>

#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");
}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值