顺序栈

栈(或称堆栈): 是一种仅允许在一端进行插入和删除运算的线性表, 遵循后进先出(Last In First Out,LIFO)的原则。
栈顶:栈中可以进行插入和删除的那一端,即线性表的表尾。
栈底:栈中不可以进行插入和删除的那一端,即线性表的表头。
进栈(或称入栈、压栈):向一个栈插入新元素,即把新元素放到栈顶元素的上面,使其成为新的栈顶元素。
出栈(或称退栈):一个栈删除元素,即把栈顶元素删除掉,使其下面相邻的元素成为新的栈顶元素。 

存储结构:有顺序存储和链接存储两种结构,链接存储的栈叫链栈。 

头文件

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

#define  STACK_INIT_SIZE 10//存储空间初始分配量
#define  STACKINCREMENT 2//存储空间分配增量
#define  OK 1
#define  ERROR 0
#define  OVERFLOW -1
#define  TRUE 1
#define  FALSE 0
typedef int Status ; 
typedef int SElemType;

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

 /*构造一个空栈S*/
 Status InitStack(SqStack *s);
 
 /*销毁栈S*/
 Status DestroyStack(SqStack *s);
 
 /*将S清为空栈*/
 Status ClearStack(SqStack *s);
 
 /*判断栈S是否是空栈*/
 Status StackEmpty(SqStack s);
 
 /*返回栈S的元素个数*/
 int StackLength(SqStack s);
 
 /*用e返回S的栈顶元素*/
 Status GetTop(SqStack s, SElemType *e);
 
 /*插入元素e为新的栈顶元素*/
 Status Push(SqStack *s, SElemType e);
 
 /*删除S的栈顶元素,并用e返回其值*/
 Status Pop(SqStack *s, SElemType *e);
 
 /*遍历栈,打印出元素*/
 Status StackTraverse(SqStack s,void (*vist)());

源文件

/*构造一个空栈S*/
Status InitStack(SqStack *s)
{
	(*s).base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
	if (!s->base)
	{
		exit(-1);
	}
	s->top=s->base;
	s->stacksize=STACK_INIT_SIZE;
	return OK;
}

/*销毁栈S*/
Status DestroyStack(SqStack *s)
{
	free(s->base);
	s->base=NULL;
	s->top=NULL;
	s->base=0;
	return OK;
}

/*将S清为空栈*/
Status ClearStack(SqStack *s)
{
	s->top=s->base;
	return OK;
}

/*判断栈S是否是空栈*/
Status StackEmpty(SqStack s)
{
	if (s.base==s.top)
	{
		return TRUE;
	}
	else
	{
		return FALSE;
	}
}

/*返回栈S的元素个数*/
int StackLength(SqStack s)
{
	return s.top-s.base;
}

/*用e返回S的栈顶元素*/
Status GetTop(SqStack s, SElemType *e)
{
	if (StackEmpty(s))
	{
		return ERROR;
	}
	else
	{
		*e=*(s.top-1);
		return OK;
	}
}

/*插入元素e为新的栈顶元素*/
Status Push(SqStack *s, SElemType e)
{
	if ((*s).top-(*s).base>=(*s).stacksize)/*栈满,追加空间*/
	{
		(*s).base=(SElemType *)realloc((*s).base,((*s).stacksize+STACKINCREMENT)*sizeof(SElemType));
		if (s->base==NULL)
		{
			exit(OVERFLOW);//存储分配失败
		}
		s->top=s->base+s->stacksize;
		s->stacksize+=STACKINCREMENT;
	}
	*(s->top)++=e;
	return OK;
}

/*删除S的栈顶元素,并用e返回其值*/
Status Pop(SqStack *s, SElemType *e)
{
	if (StackEmpty(*s))
	{
		return ERROR;
	}
	else
	{
		*e=*--s->top;
	}
	return OK;
}

/*遍历栈,打印出元素*/
Status StackTraverse(SqStack s,void (*vist)())
{
	while(s.top>s.base)
	{
		vist(*s.base++);
	}
	printf("\n");
	return OK;
}
void print(SElemType i)  
{  
 printf("%d ",i);  
} 

主程序及程序运行结果

int main()
{
	int i;
	SElemType val;
	SElemType Item;
	SqStack s;
	InitStack(&s);
	printf("0-9依次入栈并输出:\n");  
	for(i=0;i<10;i++)  
	{  
		Push(&s,i);  
		GetTop(s,&val);  
		printf("%d ",val);  
	} 
	printf("\n");
	printf("\n");
	if(StackTraverse(s,print))
	{
		printf("遍历栈成功!\n");
	}
	printf("\n栈中元素依次出栈并输出如下:\n");  
	for(i=0;i<10;i++)  
	{  
		Pop(&s,&Item);  
		printf("%d ",Item);  
	}
	printf("\n");
	ClearStack(&s);  
	if(StackEmpty(s))  
		printf("\n栈置空成功\n"); 
	if(DestroyStack(&s))
	printf("栈已被销毁\n");  
	return 0;
};



评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值