栈的表示与实现操作

1.顺序栈

2.链栈

顺序栈

利用一组地址连续的存储单元依次存放栈底到栈顶的数据元素。

1.顺序栈的表示

栈有两个指针:top指向栈顶元素之上
base指向栈底元素
空栈:top == base
满栈:top-base = stacksize
入栈:top上移,出栈top下移
特点:后进先出,方便简单,容易溢出

# define MAXSIZE 100
typedef struct{
	SElem Type *base;
	SElem Type *top;
	int stacksize;
}Sqstack;

2.顺序栈的初始化

算法思想:
1.开辟一块指定元素个数的空间;
2.令top 和base 相等,栈为空;
3.初始化stacksize = MAXSIZE.

status Initstack(Sqstack &S){
S.base = new SElemType[MAXSIZE];
if(!S.base)
	exit OverFlow;
S.top = S.base;
S.stacksize = MAXSIZE;
return OK;
}

3.判断顺序栈是否为空

算法思想:
判断base 和top 是否相等

status StackEmpty(Sqstack &S){
if(S.top == S.base)
	return TRUE;
else
	return FALSE;
}

4.清空顺序栈

status ClearStack(Sqstack &S){
if(S.base)
	S.top = S.base;
return OK;
}

5.销毁顺序栈

status Destroystack(Sqstack &S){
if(S.base)
	{delete S.base;
	S.stacksize = 0;
	S.top = S.base = NULL;}
return OK;
}

6.入栈

算法思想:
1.判断栈是否已满,若满则溢出;
2.元素e压入栈;
3.栈顶指针top+1.

status push(Sqstack &S, SElemType e){
if(S.top - S.base == stacksize)
	return ERROR;
*S.top = e;
S.top++;
return OK;
}

7.出栈

算法思想:
1.判断栈是否为空;
2.获取元素出栈;
3.栈顶指针top-1.

status pop(Sqstack &S, SElemType &e){
if(S.base == S.top)
	return ERROR;
S.top--;
e = *S.top;
return OK;
}

链栈

链栈是受限的单链表,只能在链表头部进行插入删除操作。

1.链表的定义

typedef struct StackNode{
SElemType data;
struct StackNode *next;
}StackNode,*LinkStack;

链表的头指针就是栈顶,不需要头结点;
链栈基本不存在满栈的情况;
空栈相当于头指针指向空;
插入和删除只能在栈顶进行。

2.链栈的初始化

头指针为空即可

void InitStack(LinkStack &S){
S = NULL;
return OK;
}

3.判断链栈是否为空

判断头指针是否为空

status StackEmpty(LinkStack &S)
{
if(S == NULL)
	return TRUE;
else
	return FALSE;
}

4.入栈

算法思想:
1.创建一个空间p;
2.给p的data赋值;
3.给P的next赋值,原来栈顶元素的地址;
4.top上移

status push(LinlStack &S,SElemType e)
{
p = new StackNode;
p->data = e;
p->next = S;
S = P;
return OK;
}

5.出栈

算法思想:
1.判断栈是否为空;
2.获取栈顶元素;
3.top下移

status pop(LinkStack &S,SElemType &e){
if(S == NULL)
	return ERROR;
e = S->data;
p = S;
S = S->next;
delete p;
return OK;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值