数据结构——栈之顺序栈

1、栈

栈也属于线性表,但是和顺序表的操作有些不用。线性表就像用书立放着的一堆书,想用的时候,随便可以取用里面的一本,也可以交换书的顺序。


然而,栈就像一堆叠放着的书,我们每次只能拿最上面的书,当然也再加一本书也只能放在最上面。

2、栈的抽象数据类型


3、栈的实现

3.1栈的初始化

对于顺序栈,初始化就是要给栈分配好内存空间,并且给栈的属性(栈的最大容量,当前栈的长度等)初始化。

void InitStack_Sq(SqStack &S,int maxsize,int incresize)
{
	S.stack = (ElemType *)malloc(maxsize * sizeof(ElemType));//分配栈空间
	if (S.stack == NULL)//如果分配失败,退出
	{
		 exit(0);
	}
	S.top = -1;//空栈
	S.stacksize = maxsize;
	S.increamentsize = incresize;
}

3.2求栈的长度

和顺序表一样,直接返回当前栈的长度就可以了。

int StackLength_Sq(SqStack S)
{
	return S.top + 1;
}

3.3进栈

      栈的操作中,进栈和出栈是最重要的两个操作。进栈就相当于在前面的比喻中,在一堆书上面再放上一本书。

      和放书的操作一样,在放之前我们有必要看看是不是书的高度已经到顶了(栈满了),如果满了就想办法看能不能增加一点空间,然后再把书放上去。

      官方一点就是:先判断栈是否已满,若已满,则重新分配空间,然后将栈顶指针加1,再将元素插入到栈中。

bool Push_Sq(SqStack &S,ElemType e)
{
	if (StackLength_Sq(S) >= S.stacksize)
	{
		S.stack = (ElemType *) realloc (S.stack,(S.stacksize + S.increamentsize) * sizeof(ElemType));
		if (S.stack == NULL)
		{
			return false;
		}
		S.stacksize += S.increamentsize;
	}
	S.stack[++S.top] = e;
	return true;
}

3.4出栈

       出栈就不用像进栈那样要判断是不是没有空间了,但是,和拿书一样,在拿之前我们要先看看是不是有书(判断栈是否为空)。

实现过程:先判断栈是否为空,若不为空,则取栈顶元素,并将栈顶指针减1。

bool Pop_Sq(SqStack &S,ElemType &e)
{
	if (S.top == -1)
	{
		return false;
	}
	e = S.stack[S.top--];
	return true;
}

3.5取栈顶元素

        这个和出栈有点不一样,但是也有点相似。不同的是,取栈顶元素不用将栈顶元素取出后删除(这个有点像复制,把栈顶元素复制一个)。

bool GetTop_Sq(SqStack S,ElemType &e)
{
	if (S.top == -1)
	{
		return false;
	}
	e = S.stack[S.top];
	return true;
}

3.6判空

      栈是否为空也是栈的一个属性,所以,和求栈的长度一样,直接返回值就行了。

bool StackEmpty_Sq(SqStack S)
{
	if (S.top == -1)
	{
		return true;
	}
	else
	{
		return false;
	}
}

3.7销毁

      栈在用完之后就要销毁,顺序栈的销毁就是把栈内数据全部销毁,然后将栈的各个属性归零。

void DestroyStack_Sq(SqStack &S)
{
	free(S.stack);
	S.stacksize = 0;
	S.top = -1;
}

4.实现测试

main.cpp

#include <iostream>
#include <iomanip>
#include "stack.h"

using namespace std;

void main()
{
	SqStack myStack;
	ElemType num[10] = {0,1,2,3,4,5,6,7,8,9};
	ElemType temp;
	InitStack_Sq(myStack,100,100);
	cout<<"进栈顺序:"<<endl;
	for (int i = 0;i < 10;i ++)
	{
		if ( !Push_Sq(myStack,num[i]) )
		{
			cout<<"进栈失败"<<endl;
			system("pause");
			return;
		}
		else
		{
			cout<<setw(4)<<num[i];
		}

	}
	cout<<endl;
	cout<<"出栈顺序:"<<endl;
	for (int i = 0;i < 10;i ++)
	{
		if (!Pop_Sq(myStack,temp))
		{
			cout<<"出栈失败"<<endl;
			system("pause");
			return;
		}
		else
		{
			cout<<setw(4)<<temp;
		}
	}
	cout<<endl;
	DestroyStack_Sq(myStack);
	system("pause");
}

结果:



————————————————————————————————————————————————






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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值