顺序栈与链栈,定义,结构,基本操作

一、栈
定义:栈是仅在表尾进行插入或删除操作的线性表,表头端称为栈底,表尾端称为栈顶,对于栈中的进栈与退栈,进栈的第一个元素在栈中位置为栈底元素,退栈的第一个元素为栈顶元素,遵循着先进后出,后进先出的原则。而栈又分为了顺序栈和链栈。

(1)顺序栈: 利用一组地址连续的存储单元(数组),从栈底到栈顶依次存放数据元素。

在这里插入图片描述顺序栈的存储结构:
typedef struct{
int *base; //栈底指针
int *top; //栈顶指针
int *stacksize; //栈可存储元素数目
}SqStack;

(2)顺序栈的基本操作:
1、顺序栈的初始化
算法步骤:
a.确定栈的可存储元素数目
b.根据栈的大小来申请相应大小的存储空间(数组)
c.把获得的数组空间首地址赋给top、base指针,让指针同时指向数组空间的首地址
Status InitStack(SqStack &p){
p.stacksize=50; //此处假设存储元素个数最多为50
p1=new int[50]; //申请存储空间
if(!p1) return ERROR;
p.base=p1;
p.top=p1;
return OK;
}
2、顺序栈的入栈操作:
当数据元素加入栈中时,top指针随着加入元素而加一。
算法步骤:
a.因为栈的存储空间已经限定好,所以要先判断能不能继续存储数据
b.把新数据i加入栈中
c.top加一
Status IntoStack(SqStack &p,int i){
if((p.top-p.base)==stacksize) return ERROR;
*(p.top)=i;
p.top++;
return OK;
}
3、顺序栈的出栈操作:
当数据元素被移出栈时,top指针减一。
a.因为要将栈内元素移出栈前提是栈中必有元素存在,所以要先判断栈是否为空
b.top减一
Status MoveStack(SqStack &p){
if(p.base == p.top)return ERROR;
p.top–;
return OK;
}

(3)链栈:链栈是指采用链式存储结构实现存储数据的栈,其基本结构与单链表的结点相同。
在这里插入图片描述
链栈的存储结构:
typedef struct SNode{
char data;
struct SNode *next;
}SNode,*LinkStack;

(4)链栈的基本操作:
1、链栈的初始化
链栈的初始化就是构造一个空栈
Status InitStack(LinkStack &S){
S=NULL;
return OK;
}
2、入栈操作:
入栈操作与单链表的插入操作类似,需将新结点的地址赋给栈顶指针,新结点中的指针指向原栈顶的地址。
算法步骤:
a.构造一个新结点p来储存新数据元素e
b.修改结点中next指针指向
c.修改栈顶指针S的指向,使其指向新结点p
Status push(LinkStack &S,char e)
p=new SNode;
p->data=e;
p->next=S;
S=p;
return OK;
}
3、出栈操作:
由于栈元素的出栈满足“后进先出”的原则,所以出栈元素即为栈顶元素,出栈时,只需保留栈点数据,改变栈顶指针即可。
a.要可出栈,则必须要有栈内数据,即该栈非空,若为空,返回ERROR
b.定义一个新结点,保存需出栈的结点地址,以备释放内存
c.将需出栈的结点数据保存在e中返回
d.使栈顶指针指向需出栈的结点的下一个结点地址
Status pop(LinkStack &S,char &e){
if(!S) return ERROR;
SNode *p;
p=S;
e=S->data;
S=S->next;
delete p;
return OK;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值