静态栈的基本操作

概述

先进先出的线性序列被称为栈,它是一种被限制的线性表,只能在一端进出操作进出的一端称占顶,另一端称栈底,栈可以用顺序存储,也可以用链式存存储,分别称为顺序栈和链栈。

1.初始化栈

可以看到base指向第一个元素的地址,top指向最后一个元素的下一个单元的地址

栈的最初状态是栈顶指针指向栈底

 

typedef struct SqStack
{
	int* top;
	int* base;
}SqStack;

//构造空栈
bool InitStack(SqStack& S)
{
	S.base = new int[Maxsize];
	//在堆区申请一块足够大的内存 将地址赋值给栈底指针
	if (!S.base)
	{
		cout << "构造失败" << endl;
		return false;
	}
	S.top = S.base;
	return true;
}

2.入栈

(1)入栈前需要检验栈是否满了

条件是当栈顶指针减栈底指针等于最大栈容量时栈就满了

tips:可能有人会有疑问 int型不是占用4个字节吗?top-base应该等于400,为什么等于100.

这里的400中的1代表一个字节

而top-base=100中的1代表的是指针的步长,一个步长占有4字节.

(2)*S.top先将栈顶指针指向的空间拿到再赋值,最后做栈顶指正的后移 所以综合为*S.top++=e;

//入栈
bool Push(SqStack& S, int e)
{
	if ((S.top - S.base) == Maxsize)
	{
		cout << "栈满" << endl;
		return false;
	}

	*S.top++ = e;//先将栈顶指针解引用 赋值后 再使栈顶指正上移
	return true;
}

 3.出栈

(1)栈无元素时不可出栈 判断条件就是栈的初始状态 栈顶指正指向栈底

(2)因为栈顶指针并未指向栈顶元素 所以需要将指针做减1操作然后解引用其指向的空间取得元素,赋值给e,最后将栈顶指针下移  综合为e = *(--S.top)

bool Pop(SqStack& S, int& e)
{
	if (S.base == S.top) //栈无元素
	{
		cout << "栈空" << endl;
		return false;
	}

	e = *(--S.top);
	//相当于
	//e = * (S.top - 1); 指针减一并未使指针移动 取栈顶元素
	//S.top--;  //指正下移实际操作

	return true;
}

3取栈顶元素

和出栈是一个道理,不过多赘述

int GetTop(SqStack S)
{
	if (S.top != S.base)
	{
		return *(S.top - 1); //取栈顶元素
	}
	else
	{
		return -1;
	}
}

 4要注意,遍历栈中元素是属于质变遍历 破坏了原有的数据,而像一些非质变遍历例如冒泡,插入,并归排序,都属于非质变排序.

综合代码如下

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
using namespace std;

const int Maxsize = 100;//尽量用const替换#define

struct SqStack
{
	int* top; //栈顶指针
	int* base;//栈底指针
};

//构造空栈
bool InitStack(SqStack& S)
{
	S.base = new int[Maxsize];
	//在堆区申请一块足够大的内存 将地址赋值给栈底指针
	if (!S.base)
	{
		cout << "构造失败" << endl;
		return false;
	}
	S.top = S.base;
	return true;
}

//入栈
bool Push(SqStack& S, int e)
{
	if ((S.top - S.base) == Maxsize)
	{
		cout << "栈满" << endl;
		return false;
	}

	*S.top++ = e;//先将栈顶指针解引用 赋值后 再使栈顶指正上移
	return true;
}

bool Pop(SqStack& S, int& e)
{
	if (S.base == S.top) //栈无元素
	{
		cout << "栈空" << endl;
		return false;
	}

	e = *(--S.top);
	//相当于
	//e = * (S.top - 1); 指针减一并未使指针移动 取栈顶元素
	//S.top--;  //指正下移实际操作

	return true;
}

int GetTop(SqStack S)
{
	if (S.top != S.base)
	{
		return *(S.top - 1); //取栈顶元素
	}
	else
	{
		return -1;
	}
}



int main()
{

	SqStack S;
	InitStack(S);
	cout << "请输入元素个数" << endl;
	int n = 0;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		int e;
		cin >> e;
		Push(S, e);
	}
	cout << "栈的元素输出" << endl;
	for (int i = 0; i < n; i++)
	{
		int e = 0;
		Pop(S, e);
		cout << e << " ";
	}
	cout << endl;


	system("pause");
	return EXIT_SUCCESS;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值