栈(顺序栈、链式栈)

不管顺序栈还是链式栈遵循前进后出的规则。


顺序栈

 

顺序栈是用顺序表(地址连续的存储空间)实现的栈存储结构。

栈的定义实现:

#define STACK_SIZE 20		// 默认栈大小
#define INF 32767
typedef int eleType ;		// 栈存储元素类型

// 数组形式存储栈结构(先入后出)
class sqStack {
public:
	sqStack(int size = STACK_SIZE) :elements(new eleType[size]), top(-1), maxSize(size) {}
	bool Push(eleType ele);			// 入栈
	bool Pop();						// 出栈
	eleType getTop();				// 获取栈顶元素
private:
	eleType* elements;			// 存储信息的顺序栈
	int top;					// 栈顶元素下标
	int maxSize;				// 栈最大元素个数
};

封装实现栈操作: 

// 入栈
bool sqStack::Push(eleType ele) {
	if (maxSize - 1 == top) { // 栈满
		return false;
	}
	elements[++top] = ele;
	return true;
}
// 出栈
bool sqStack::Pop() {
	if (-1 == top) {	// 栈空
		return false;
	}
	--top;
	return true;
}
// 获取栈顶元素
eleType sqStack::getTop() {
	if (-1!= top) {
		return elements[top];
	}
	return INF;
}


 链式栈

 

 

 链式栈就是一种操作受限的单向链表,仅允许对栈顶元素(单向链表的表尾)进行操作。

采用模板类实现:

// 节点
template<class T>
class SNode {
public:
	SNode() {}
	SNode(T e) :elem(e), Next(NULL) {}
	T elem;
	SNode* Next;
};
// 链式栈
// 该栈结构为:
//  
//		  辅助头节点		      top(栈顶)						  base(栈底)
//		     |				   |							   |
//		    Head-------------->ele1 --->ele2-->ele3-->......-->ele
template<class T>
class ListStack {
public:
	bool Push(T elem);		// 入栈
	bool Pop();				// 出栈
	T getTop();				// 获取栈顶元素		
	bool Is_empty();		// 判断栈是否为空
private:
	SNode<T>* Head = new SNode<T>();		// 头节点不储存信息,仅辅助作用
};

基本操作:


入栈 

// 入栈
template<class T>
bool ListStack<T>::Push(T elem)  {
	SNode<T>* Temp = Head->Next;
	// 根据 前进后出  采用头插法
	Head->Next = new SNode<T>(elem);
	if (Head->Next) {		// 新分配内存成功
		Head->Next->Next = Temp;
		return true;
	}
	return false;
}

出栈: 

// 出栈
template<class T>
bool ListStack<T>::Pop() {
	if (NULL == Head->Next) { 
		return false;
	}
	Head->Next = Head->Next->Next;
	return true;
}

获取栈顶元素: 

// 获取栈顶元素
template<class T>
T ListStack<T>::getTop() {
	if (NULL == Head->Next) {
	//  !--- 此处我也不知道返回啥值 --- !
		return Head->elem;		
	}
	return Head->Next->elem;
}

是否为空: 

// 判断栈是否为空
template<class T>
bool ListStack<T>::Is_empty() {
	if (NULL != Head->Next) {
		return false;
	}
	return true;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值