数据结构--栈

(stack)又名堆栈:

它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈(push),它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈(pop),它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。因此对于栈而言,最重要的性质就是后入先出。

在数据结构中,经常要用到的一个概念就是ADT,也就是Abstract Data Type,也就是对数据类型的抽象,或者是抽取,提取这类数据所具有的特征或者是方法,在C++中,表现为类的抽象,在C中表现为结构体的抽象。一般来说,进行ADT需要进行三个方便的考虑,也就是

ADT
{
      数据对象;
      数据操作;
      数据关系;

}

1.数据类型一般指的是比如int,float这些基本的数据类型;在类中一般表现为private的性质,即一般是类的私有成员;

2.操作方法一般指的是对数据类型的某些操作,比如返回数据类型的值,供外部调用等;

对于栈而言,根据上文对于栈的定义来说,基本操作包含:

1、删除数据pop()操作以及插入数据操作push()操作。这里的pop和push的的函数命名方式很有讲究,为什么不直接命名为Add()和Delete()函数呢,对于栈来说,只能在一端进行删除和插入数据,这里可能最开始创造栈这种数据结构的人,可能就联想到手枪的操作方式,当你在弹夹加子弹时,一般来说就是往弹夹压入(push)子弹,然后打枪时,是弹出(pop)子弹,因此这种对栈的插入删除操作的方式沿用至今,我们还是要尊重经典和前辈。

2、然后呢,我们应该对栈是满栈或者是空栈进行判断,因此应该有IsFull()或者IsEmpty的操作;

3、此外我们或许需要对栈顶的数据进行方法,因此可以有Top()的方法;由此我们可以得到比较初步的栈的ADT定义:

#include<iostream>
#include<algorithm>
using namespace std;
template<class Type>
class stack
{
public:
	stack(int stackcapacity);
	bool IsEmpty();
	bool IsFull();
	Type Top()const;
	void push(const Type & item);
	void  pop();
	int Getlength()const;
private:
	Type *p_stack;
	int top;
	int capacity;
};

注:在这里使用了模板类的方法,在C++中,很重要的一个概念是泛型编程,为了使得stack这个类可以容纳各种基本类型或者是自定义的类,使用模板类的方法可以很好的实现代码重用的目的。

具体实现的的方法:

#include<iostream>
#include<algorithm>
using namespace std;
template<class Type>
class stack
{
public:
	stack(int stackcapacity);
	bool IsEmpty();
	bool IsFull();
	Type Top()const;
	void push(const Type & item);
	void  pop();
	int Getlength()const;
private:
	Type *p_stack;
	int top;
	int capacity;
};

template<class Type>
stack<Type>::stack(int stackcapacity)
{
	capacity = stackcapacity;
	top = -1;
	p_stack = new Type[capacity];
}

template<class Type>
bool stack<Type>::IsEmpty()
{
	if (top == -1)
		return true;
	else
		return false;
}

template<class Type>
bool stack<Type>::IsFull()
{
	if (top == (capacity - 1))
		return true;
	else
		return false;
}

template<class Type>
Type stack<Type>::Top() const
{
	return p_stack[top];
}

template<class Type>
void stack<Type>::push(const Type & item)
{
	if (IsFull())
	{
		capacity *= 2;
		Type * temp = new Type[capacity];
		copy(p_stack, p_stack + capacity, temp);
		delete[] p_stack;
		p_stack = temp;
	}
	p_stack[++top] = item;
}

template<class Type>
void stack<Type>::pop()
{
	if (IsEmpty())
		printf("the stack is empty, can not delete");

	else
	{
		p_stack[top] = p_stack[top - 1];
		--top;
	}

}

template<class Type>
int stack<Type>::Getlength() const
{
	return top + 1;
}

接着我们看看stack这中数据结构是否达到了ADT的功能:

#include"stack.h"
int main()
{
	int capacity = 10;
	stack<int> mystack(capacity);
	for (int i = 0; i < 9; i++)
	{
		mystack.push(i);
	}

	cout << "the top element is this stack is: "<<mystack.Top() << endl;
	if (!mystack.IsFull())
		cout << "the stack is not full" << endl;

	mystack.push(9);
	cout << "the top element is this stack is: " << mystack.Top() << endl;
	if (mystack.IsFull())
		cout << "the stack is full" << endl;

	cout << "the length of the stack is: "<<mystack.Getlength() << endl;
	mystack.pop();
	cout << "the length of the stack is: " << mystack.Getlength() << endl;
	return 0;
}

得到最终的结果是:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值