栈的创建和基本使用

栈是操作受限的线性表,即栈只能在表尾进行插入删除的操作

所以和线性表一样根据存储方式的不同可以将栈分为顺序栈和链栈

顺序栈:(结构体的定义)

typedef int SElemType;  //按照栈存储的元素的具体数据类型来定义数据类型
typedef struct {
	SElemType* base; //栈底指针
	SElemType* top;  //栈顶指针
	int stacksize;  //栈可用最大空间
}SqStack;

栈中的元素个数=top - base

 

初始化:

Status ChuShihua(SqStack &s){
	s.base = new SElemType[100];
	//s.base = (SElemType*)malloc(MAXSIZE * sizeof(SElemType));
	if (!s.base) printf("分配失败");
	s.top = s.base; //栈顶指针等于栈底指针
	s.stacksize = 100;  //设置栈的最大存储空间大小 
	return ok;
}

代码中的Status是根据自己需要自行定义的数据类型

s.base = (SElemType*)malloc(MAXSIZE * sizeof(SElemType));为C语言方式的分配存储空间

代码中为C++的方式(释放空间时使用delete),C语言释放空间则使用free

 

判断栈是否为空:

Status IsEmpty(SqStack s) {
	if (s.top == s.base)
		return true;
	else
		return false;
}

清空栈:

Status Clear(SqStack s) {
	if (s.base) s.top = s.base; //如果栈存在且栈底不为空则将栈清空
	return 0;
}

销毁栈:


Status Destroy(SqStack& s) {
	if (s.base) {    //如果栈底元素不为空则依次释放栈底的存储空间,直到都为空为止
		delete s.base;
		s.stacksize = 0;
		s.base = s.top = NULL;
	}
	return 0;
}

入栈:


Status Push(SqStack& s, SElemType e) {
	if (s.top - s.base == s.stacksize) //栈满
		return  false;
	*s.top++ = e;  //将存入元素置于栈顶然后将栈顶指针向上移一位
	return true;
}

出栈:

Status Pop(SqStack& s, SElemType& e) {
	if (s.top == s.base)
		return 0;
	e = *--s.top;
	return 1;
}


   1、判断是否为空栈

   2、获取栈顶元素e、
   3、栈顶指针减1
 

链栈:运算受限的单链表,只能在链表头部进行操作

链栈(结构体的创建):

typedef int SElemType;
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) {
	p = new StackNode; //生成新的结点
	p->data = e;//将新结点数据域置为e
	p->next = s;//将新结点插入栈顶
	s = p; //修改栈顶指针
	return true;
}

出栈:


Status Pop(LinkStack& s, SElemType& e) {
	LinkStack p;     
	if (s == NULL)
		return false;
	e = s->data;      //将栈顶元素的数据域的值赋值给e
	p = s;            //创建一个新的指针p使p指向要出栈的栈顶元素
	s = s->next;      //使栈顶元素的下一个元素成为栈顶元素
	delete p;         //释放p的存储空间即释放栈顶元素的存储空间
	return true;
}

取栈顶元素:


SElemType GetTop(LinkStack s) {
	if (s != NULL)
		return s->data;
}

  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值