DS之顺序栈

      顺序栈的基本操作

0基本操作前的准备

<span style="font-size:18px;">#include <iostream>
using namespace std;
//两个C语言的头文件库
#include <malloc.h>
#include <stdlib.h>
//以下是宏定义
#define OK 1
#define ERROW 0
#define OVERFLOWE -2
#define TRUE 1
#define FALSE 0
#define INFEASIBLE -1
#define STACK_INIT_SIZE 100//存储空间初始分配量
#define STACKINCREMENT 10//存储空间分配增量
//以下是类型重新定义
typedef int SElemType;//重新定义SElemType为int型
typedef int Status;//重新定义Status为int型
//下面的是栈的定义和基本操作
typedef struct{//重新定义SqStck为结构类型
	SElemType *base;//栈底指针
	SElemType *top;//栈顶指针
	int stacksize;//栈的当前可使用的最大容量
}SqStack;</span>

1构造一个空栈

<span style="font-size:18px;">//1构造一个空栈
Status InitStack(SqStack &S)
{
	S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
	if(!S.base)
	{
		exit(OVERFLOW);//存储分配失败
	}
	S.top=S.base;
	S.stacksize=STACK_INIT_SIZE;
	return OK;
}</span>

2判断栈是否为空

<span style="font-size:18px;">//2判断栈是否为空
Status StackEmpty(SqStack S)
{
	if(S.base==S.top)
	{
		return TRUE;
	}
	else
	{
		return FALSE;
	}
}</span>

3清空一个栈

<span style="font-size:18px;">//3清空一个栈
Status ClearStack(SqStack &S)
{
	S.top=S.base;
	S.stacksize=STACK_INIT_SIZE;
	return OK;
}</span>

4销毁一个栈

<span style="font-size:18px;">//4销毁一个栈
Status DestroyStack(SqStack &S)
{
	delete S.base;
	S.base=NULL;
	S.top=NULL;
	S.stacksize=0;
	return OK;
}</span>

5取栈的长度

<span style="font-size:18px;">//5取栈的长度
Status StackLength(SqStack S)
{
	return S.top-S.base;
}</span>

6取栈顶的元素

<span style="font-size:18px;">//6取栈顶元素
Status GetTop(SqStack S,SElemType &e)
{
	if(S.top==S.base)
	{
		return ERROW;
	}
	e=*(S.top-1);
	return OK;
}</span>

7出栈

<span style="font-size:18px;">//7出栈
Status Pop(SqStack &S,SElemType &e)
{
	if(S.top==S.base)
	{
		return ERROW;
	}
	e=*--S.top;
	return OK;
}</span>

8进栈

<span style="font-size:18px;">//8进栈
Status Push(SqStack &S,SElemType e)
{
	if(S.top-S.base>=S.stacksize)
	{
		//栈满追加存储空间
		SElemType *newbase=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
		if(!newbase)
		{
			exit(OVERFLOW);
		}
		S.base=newbase;
		S.top=S.base+S.stacksize;
		S.stacksize+=STACKINCREMENT;
	}
	*S.top++=e;
	return OK;
}</span>

9栈元素的遍历

<span style="font-size:18px;">//9栈元素的遍历
Status StackTraverse(SqStack S,Status(*visit)(SElemType))
{
	while(S.top>S.base)
	{
		visit(*S.base++);
	}
	return OK;
}
//遍历栈元素的输出
Status sc(SElemType i)
{
	return i;
}</span>

10主函数

<span style="font-size:18px;">//主函数
int main()
{
	SqStack s;
	SElemType tp1;
	SElemType tp2;
	InitStack(s);
	cout<<"0-9依次入栈并输出:"<<endl;
	for(int i=0;i<10;i++)
	{
		Push(s,i);
		GetTop(s,tp1);
		cout<<tp1<<endl;
	}
	if(StackTraverse(s,sc))
	{
		cout<<"遍历栈成功"<<endl;
	}
	cout<<"栈中元素依次出栈并输出:"<<endl;
	for(int j=0;j<10;j++)
	{
		Pop(s,tp2);
		cout<<tp2<<endl;
	}
	ClearStack(s);
	if(StackEmpty(s))
	{
		cout<<"栈清空成功"<<endl;
	}
	if(DestroyStack(s))
	{
		cout<<"栈销毁成功"<<endl;
	}
	return 0;
}</span>

        输出的结果为:

 

 


 


 




 







 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值