数据结构_顺序栈

1 数据结构_顺序栈

1.1 栈的定义

1)栈是一种只能在一段进行插入或删除操作的线性表,表中允许进行插入,删除操作的一段称为栈顶。表的另一端称为栈低。栈中没有数据被称为空栈。栈的插入操作常被称为压栈进栈。栈的删除常被称为退栈出栈

2)栈的主要特点是“后进先出”,即先进栈的元素先弹出。栈也被称为后进先出表

1.2 栈的顺序结构基本运算实现

假设栈的元素个数不超过正整数 MaxSize,所有元素都具有同一数据类型ElemType,则可以用一下方式定义顺序栈类型SqStack:

typedef struct
{
	ElemType data[MaxSize];
	int top;       //栈顶指针
}SqStack;          //定义顺序栈类型

(1)初始化栈InitStack(s)。
建立一个空栈s,实际上将栈顶指针指向-1即可。

void InitStack(SqStack * &s)
{
	s = (SqStack *)malloc(sizeof(SqStack));
	s->top = -1;         //栈顶指针置为-1
}

(2)销毁栈 DestoryStack(s)。
释放栈s占用的内存。

void DestoryStack(SqStack * &s)
{
	free(s);
}

(3)判断栈是否为空 StackEmpty(s)。
栈s为空的条件是s->top == -1。

bool StackEmpty(SqStack * s)
{
	return (s -> top == -1);
}

(4)进栈Push(s,e)。
在栈不满的情况下,先将栈顶指针增1,然后在栈顶指针指向位置插入元素e。

bool Push(SqStack * &s,ElemType e)
{
	if(s->top==MaxSize-1)   //栈满的情况下,即栈溢出
		return false;
	s->top++;               //栈顶指针增1
	s->data[s->top]=e;      //元素e放在栈顶指针处
	return ture;
}

(5)处栈Pop(s,e)。
在栈不为空的情况下,先将栈顶元素赋值给e,然后将栈顶指针减1。

bool Pop(SqStack *&s,ElemType &e)
{
	if(s->top == -1)         //栈为空的情况下,即栈下溢出
		return false;
	e=s->data[s->top];      //取栈顶元素
	s->top --;              //栈顶自减1
	return true;
}

(6)取栈顶元素 GetTop(s,e)。
在栈不为空的情况下将栈顶元素赋值给e。

bool GetTop(SqStack * s,ElemType &e)
{
	if(s->top == -1)
		return false;
	e=s->data[s->top];
	return true;
}

例题:

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

typedef int ElemType;

#define MaxSize 5

typedef struct
{
	ElemType data[MaxSize];
	int top;       //栈顶指针
}SqStack;          //定义顺序栈类型


void InitStack(SqStack * &s)
{
	s = (SqStack *)malloc(sizeof(SqStack));
	s->top = -1;         //栈顶指针置为-1
}

void DestoryStack(SqStack * &s)
{
	free(s);
}

bool StackEmpty(SqStack * s)
{
	return (s -> top == -1);
}


bool Push(SqStack * &s,ElemType e)
{
	if(s->top==MaxSize-1)   //栈满的情况下,即栈溢出
		return false;
	s->top++;               //栈顶指针增1
	s->data[s->top]=e;      //元素e放在栈顶指针处
	return true;
}

bool Pop(SqStack *&s,ElemType &e)
{
	if(s->top == -1)         //栈为空的情况下,即栈下溢出
		return false;
	e=s->data[s->top];      //取栈顶元素
	s->top --;              //栈顶自减1
	return true;
}


int main()
{
	int i,a,e;
	SqStack *st;
	InitStack(st);
	for(i=0;i<MaxSize;i++)
	{
		scanf("%d",&a);
		Push(st,a);
	}
	for(i=0;i<MaxSize;i++)
	{
		Pop(st,e);
		printf("%5d",e);
	}
	DestoryStack(st);
	putchar('\n');
	system("pause");
	return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值