数据结构 栈的基本操作(C语言版)

实现代码

#include <stdio.h>
#include <stdlib.h>
#include <math.h>//OVERFLOW 
//函数结果状态代码 
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
//Status是函数的类型,其值是函数结果状态代码,邚OK等
typedef int Status; 
typedef int SElemType;
//顺序栈的结构定义 
#define STACK_INIT_SIZE 100//存储空间初始分配量 
#define STACKINCREMENT 10//存储空间分配增量 
typedef struct{
	SElemType *base;//在栈构造之前和销毁之后,base的值为NULL 
	SElemType *top;//栈顶指针 
	int stacksize;//当前已分配的存储空间,以元素为单位 
}SqStack;
//操作结果:构造一个空栈S 
Status InitStack(SqStack &S){ 
	S.base=(SElemType *)malloc(STACK_INIT_SIZE *sizeof(SElemType));//动态申请内存 
	if(!S.base){
		printf("动态存储空间分配失败,退出!\n");
		exit(OVERFLOW); //存储分配失败 
	}
	S.top=S.base;//栈顶元素指向栈底(空栈) 
	S.stacksize=STACK_INIT_SIZE;//存储空间为初始分配量 
	printf("初始化成功!\n");
	return OK;
}
//初始条件:栈S已存在
//操作结果:栈S被销毁 
Status DestroyStack(SqStack &S){//销毁栈S,S不再存在 
	free(S.base);//动态释放内存 
	S.top=S.base=NULL;//栈顶,栈底指针均为空
	S.stacksize=0;//当前已分配的存储空间为0 
	return OK;
}
//初始条件:栈S已存在
//操作结果:将S请为空栈 
Status ClearStack(SqStack &S){//把S置为空栈 
	S.top=S.base;
	return OK;
}
//初始条件:栈S已存在
//操作结果:若栈S为空栈,则返回TRUE,否则FALSE 
Status StackEmpty(SqStack S){//若栈S为空栈,则返回TRUE,否则返回FALSE 
	if(S.top==S.base) return TRUE;
	else return FALSE;
}
//初始条件:栈S已存在
//操作结果:返回S的元素个数,即栈的长度 
int StackLength(SqStack S){//返回S的元素个数,即栈的长度 
	return S.top-S.base;
}
//初始条件:栈S已存在且非空
//操作结果:用e返回S的栈顶元素 
Status GetTop(SqStack S,SElemType &e){
	if(S.top==S.base)return ERROR;
	e=*(S.top-1);
	return OK;
}
//初始条件:栈S已存在
//操作结果:插入元素e为新的栈顶元素 
Status PushStack(SqStack &S,SElemType e){//输入元素e为新的栈顶元素 
	if(S.top-S.base==S.stacksize){//当前存储空间已满,增加分配 
		S.base=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));//追加存储空间 
		if(!S.base){
			printf("追加存储空间失败,退出!\n");
			exit(OVERFLOW);
		}
		S.top=S.base+S.stacksize;//修改栈顶指针,指向新的栈顶 
		S.stacksize+=STACKINCREMENT;//更新当前已分配的存储空间 
	}
	*S.top++=e;//将e入栈,成为新的栈顶元素,栈顶指针上移一个存储单元 
	return OK;
}
//初始条件:栈S已存在且非空
//操作结果:删除S的栈顶元素,并用e返回其值 
Status Pop(SqStack &S,SElemType &e){ 
	if(S.top==S.base)return ERROR;
	e=*--S.top;//将栈顶元素赋值给e,栈顶指针下移一个存储单元 
	return OK;
}
Status visit(SElemType e){
	printf("%d ",e);
	return true;
}
//初始条件:z栈S已存在且非空
//操作结果:从栈低到栈顶依次对S的每个数据元素调用函数visit(),一旦visit()失败, 则操作无效 
Status StackTravel(SqStack S,Status (*visit)(SElemType)){
	SElemType *p=S.base;
	while(S.top>p)//p指向栈元素
		visit(*p++);//对该栈元素调用visit(),p指针上移一个存储单元
	printf("\n"); 
	return OK;
}
int main(){
	SqStack S;
	int i,length;
	SElemType e;
	InitStack(S);
	printf("top=%d,base=%d\n",S.top,S.base);
  	PushStack(S,1);
  	printf("top=%d,base=%d\n",*(S.top-1),*S.base);
  	GetTop(S,e);
  	printf("%d\n",e);
  	PushStack(S,2);
  	printf("栈中有%d个元素\n",StackLength(S));
  	printf("top=%d,base=%d\n",S.top,S.base);
  	printf("*top=%d,*base=%d\n",*(S.top-1),*(S.base));
  	DestroyStack(S);
  	printf("销毁后top=%d\n",S.top);
  	printf("*top=%d,*base=%d\n",*(S.top-1),*(S.base));
  	system("pause");
	return 0;
}

运行结果
在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值