栈的表示

栈的表达主要有顺序表示和链式表达两种:

顺序表达;

#include<iostream>
#include<stdio.h>
//函数结果状态代码
#define MAXSIZE 100
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
//#define OVERFLOW -2
//Status 是函数的类型,其值是函数结果状态代码
typedef int Status,Elemtype, SElemType,QElemType;

using namespace std;
//栈:分为顺序栈和链
//顺序栈的表示如下
typedef struct
{
	SElemType* base;//栈底指针
	SElemType* top;//栈顶指针
	int stacksize;//栈的大小
}SqStack;

//栈的初始化
Status InitStack(SqStack & S)
{
	S.base = new SElemType[MAXSIZE];  //base指针指向首元素的地址,分配一块空间
	if (!S.base) exit(OVERFLOW);//存储分配失败
	S.base = S.top;
	S.stacksize = MAXSIZE;
}

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


//清空顺序栈(空间还在)
Status ClearStack(SqStack &S)//我觉得应该传递引用
{
	if (S.base)  //base存在即可
	{
		S.top = S.base;
	}
	return OK;
}

//销毁顺序表
Status DeleteStack(SqStack& S)
{
	if (S.base)
	{
		delete S.base;  //将开辟的空间清空,但指针还在;
		S.stacksize = 0;
		S.base = S.top = NULL;//将结构中的值也销毁了
	}
	return OK;
}


//入栈:将元素移到栈顶(栈满需要判断)
Status Push(SqStack& S, SElemType e)
{
	if ((S.top - S.base) == S.stacksize)  //栈满
		return ERROR;
	//S.base[S.top - S.base - 1] = e;//或者可以用下面的表达
	*S.top = e;
	S.top++;
//上面两步骤也可以合并成 *S.top++=e;
	return OK;
}

//出栈:将元素移出(栈空需要判断)
Status Pop(SqStack& S, SElemType &e)
{
	if (S.base == S.top)//判断是否为空
		return ERROR;
	e =  *--S.top; //注意星号和--的位置
		return OK;
}

栈的链式表达:

#include<iostream>
#include<stdio.h>
//函数结果状态代码
#define MAXSIZE 100
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
//#define OVERFLOW -2
//Status 是函数的类型,其值是函数结果状态代码
typedef int Status,Elemtype, SElemType,QElemType;

using namespace std;
//链栈的表示(栈用链表的形式表示)
//定义
typedef struct StackNode
{
	SElemType data;
	struct StackNode* next;
}StackNode,*LinkStack;


//链表的初始化
void InitStack(LinkStack& S)
{
	S = NULL;//没用头结点;栈指针指着栈顶
}

//判断链栈是否为空
Status StackEmpty(LinkStack S)
{
	if (S == NULL)
		return TRUE;
	else
		return FALSE;
}

//链栈的入栈
Status Push(LinkStack& S, SElemType e)
{
	LinkStack p;
	p = new StackNode;
	p->data = e;
	p->next = S;
	S = p;
	return OK;
}

//链栈的出栈
Status Pop(LinkStack& S, SElemType& e)
{
	if (S == NULL)
		return ERROR;
	e = S->data;
	LinkStack p;
	p= S;
	S = S->next;
	delete p;
	return OK;
}

//取栈顶元素
SElemType Pop(LinkStack S)
{
	if (S == NULL)
		return ERROR;
	return S->data;
}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值