数据结构之-链式栈及其常见应用(进制转换、括号匹配、行编辑程序、表达式求值等)

本文介绍了链式栈的概念,详细讲解了其在数制转换、括号匹配、行编辑程序和表达式求值等应用场景中的实现和作用。通过具体的代码示例,阐述了栈的后进先出特性如何帮助解决这些实际问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、栈的概念

栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。总的来说就是LIFO(Last In First Out);

代码:

#pragma once
/*
*Copyright© 中国地质大学(武汉) 信息工程学院
*All right reserved.
*
*文件名称:Stack.h
*摘    要:编写栈算法
*
*当前版本:1.0
*作       者:邵玉胜
*完成日期:2018-12-28
*/

#ifndef STACK_H_
#define STACK_H_
#include<iostream>
//结点结构体,双向栈
template<class T>
struct StackNode
{
	T _tData;                                  //数据域
	StackNode<T>* _pNext;                      //指针域,指向下一结点
	StackNode<T>* _pLast;                      //指针域,指向上一结点(为了行编辑器函数的实现)
	StackNode(StackNode<T>* next = nullptr, 
		StackNode<T>* last = nullptr) {        //用指针构造函数
		this->_pNext = nullptr;
		this->_pLast = nullptr;
	}
	StackNode(T data, StackNode<T>* next = nullptr, 
		StackNode<T>* last = nullptr) {        //用指针构造函数
		this->_tData = data;
		this->_pNext = next;
		this->_pLast = last;
	}
};

template<class T>
class Stack {
private:
	StackNode<T>* _pTop;                             //栈顶指针
	StackNode<T>* _pBottom;                          //栈底指针,为了方便行编辑器使用
	int _iConuntOfElement;                           //结点数量
public:
	Stack();                                         //构造函数
	Stack(Stack<T>& copy);                           //构造函数
	~Stack();                                        //析构函数
	bool IsEmpty();                                  //判断栈是否为空
	void MakeEmpty();                                //将栈中的元素全部删除
	void Put(const T data);                          //顶端插入数据
	int Size() { return _iConuntOfElement; }         //返回栈中的结点数
	void GetTop(T& data);                            //获取顶端结点
	void Pop(T& data);                               //顶端弹出结点,并将元素传至参数中
	void Traverse();                                 //逆序栈中的结点
	void DisPlay(bool forward = true);               //输出函数,默认正向输出
};

//构造函数,为栈顶和栈底分配内存
template<class T>
Stack<T>::Stack() {
	_pTop = _pBottom = nullptr;
	this->_iConuntOfElement = 0;
}

//拷贝构造函数
//缺少此函数,在传参与析构的时候容易出问题
template<class T>
Stack<T>::Stack(Stack<T>& copy) {
	StackNode<T>* pCur = this->_pTop;            //建立指针,用于遍历本对象中的结点
	while (pCur) {                               //遍历本对象的结点
		T data = pCur->_tData;                   //依此取出结点值
		copy.Put(data);                          //插入到copy栈中
		pCur = pCur->_pNext;
	}
}                          

//析构函数
template<class T>
Stack<T>::~Stack() {
	MakeEmpty();                               //释放结点内存
	this->_pTop  = this->_pBottom = nullptr;   //将指针指向空,避免出现野指针

}

//判断栈是否为空
template<class T>
bool Stack<T>::IsEmpty() {
	if (!this->_pTop)                           //如果栈对象没有头节点,那么栈就为空
		return true;
	return false;
}

//将栈中的元素全部删除
template<class T>
void Stack<T>::MakeEmpty(){ 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值