栈(C语言实现)基本操作

1.1 栈的定义:

栈是限制在表的一端进行插入和删除的线性表。允许插入、删除的这一端称为栈顶,另一个固定端称为栈底。当表中没有元素时称为空栈。

1.2  栈的存储实现和运算实现
栈是运算受限的线性表,线性表的存储结构对栈也是适用的,只是操作不同而已。
利用顺序存储方式实现的栈称为顺序栈。与线性表类似,栈的动态分配顺序存储结构如下:
#define STACK_INIT_SIZE 100 //存储空间的初始分配量
#define STACKINCREMENT 10 //存储空间的分配增量
typedef struct{
SElemType *base; //在栈构造之前和销毁之后,base 的值为 NULL
SElemType *top; //栈顶指针
int stacksize; //当前已分配的存储空间
}SqStack;
需要注意,在栈的动态分配顺序存储结构中,base 始终指向栈底元素,非空栈中的 top始终在栈顶元素的下一个位置。
下面是顺序栈上常用的基本操作的实现。
(1)入栈:若栈不满,则将 e 插入栈顶。
int Push (SqStack &S, SElemType e) {
if (S.top-S.base>=S.stacksize)
{……} //栈满,追加存储空间
*S.top++ = e; //top 始终在栈顶元素的下一个位置
return OK;
}
(2)出栈:若栈不空,则删除 S 的栈顶元素,用 e 返回其值,并返回 OK,否则返回
ERROR。
int Pop (SqStack &S, SElemType &e) {
if (S.top==S.base) return ERROR;
e = *--S.top;
return OK;
}

出栈和读栈顶元素操作,先判栈是否为空,为空时不能操作,否则产生错误。通常栈空常作为一种控制转移的条件。

#include<stdio.h>
#include<stdlib.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define true 1
#define false 0
#define error 0
#define ok 1
//#define SElemType int
typedef int SElemType;

//顺序栈
typedef struct {
	SElemType *base;
	SElemType *top;
	int stacksize;    //当前已分配的存储空间
}SqStack;

//初始化栈
int InitStack(SqStack &S)
{
	S.base = (SElemType*)malloc(sizeof(SElemType)*STACK_INIT_SIZE);
	if (!S.base)  return error;
	S.stacksize = STACK_INIT_SIZE;
	S.top = S.base;
	return ok;
}
//销毁栈
int DestroyStack(SqStack &S)
{
	S.top = NULL;
	S.stacksize = 0;
	free(S.base);
	return ok;
}

//清空栈
int ClearStack(SqStack &S)
{
	S.top = S.base;
	return ok;
}

//判断栈是否为空
int StackEmpty(SqStack S)
{
	if (S.top == S.base)
		return 1;
	else 
		return 0;
}

//栈的长度
int StackLength(SqStack S)
{
	return (S.top - S.base);
}

//栈顶元素
int GetTop(SqStack S)
{
	if (S.top == S.base)
		return false;
	SElemType e = *(S.top - 1);
	return e;
}
//入栈
//在栈的动态分配顺序存储结构中,base 始终指向栈底元素,非空栈中的 top
//始终在栈顶元素的下一个位置。
int push(SqStack &S, SElemType &e)
{
	if (S.top - S.base >= STACK_INIT_SIZE)
	{
		//栈满
		
		S.base = (SElemType*)realloc(S.base,sizeof(SElemType)*(S.stacksize+STACKINCREMENT));
		if (!S.base)
			return false;
	S.stacksize = S.stacksize + STACKINCREMENT;
	S.top = S.base + STACK_INIT_SIZE;    
	}
	 //重新定位栈顶元素
	*S.top = e;
	S.top++;
	//*S.top++=e;
	return 1;
}
//出栈
int pop(SqStack &S, SElemType &e)
{
	if (S.base == S.top) return error;
	S.top--;
	e = *S.top;
	//e=*--S.top;
	return e;
}
int printS(SqStack S)
{
	if (S.base == NULL)
		return error;
	if (S.top == S.base)
		printf("栈中没有元素\n");
	SElemType *p = S.top;
	while (p>S.base)
	{
		p--;
		printf("%d\n", *p);
	}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值