数据结构——栈

本文详细介绍了栈的基本概念,包括其工作原理、操作(如入栈Push和出栈Pop)、以及在编程中的应用,如函数调用栈和算法问题。提供了C++中数组和链表两种栈的实现,以及STL中的stack容器。
摘要由CSDN通过智能技术生成

基本知识

栈(Stack)是一种特殊的线性数据结构,具有“先进后出”的特点。栈的存取限定在表尾端,称为栈顶。栈顶的元素是最后一个插入栈的元素,也是最先被访问的元素。类比现实生活中的堆叠书本,每次放入书本时会放在最上面,取书时也是从最上面取。

栈有两种基本操作:入栈(Push)出栈(Pop)。入栈将元素放入栈顶,出栈将栈顶元素移除并返回。

栈的应用非常广泛。例如,程序运行时的函数调用栈就是使用栈来管理函数的调用和返回过程。栈还可用于解决括号匹配问题、计算后缀表达式等。

常见的栈有数组实现和链表实现两种方式。数组实现的栈具有固定的大小,而链表实现的栈则可以动态扩展。

数组实现栈

【代码解析】

1.栈的模板类定义

#include <iostream>
#include <stdexcept>
using namespace std;

template<typename T>
class Stack {
private:
	T* data;     // T类型数组
	int size;
	int capacity;
	void resize(); // 扩容
public:
	Stack() : data(new T[10]), size(0), capacity(10) {} // Initialize capacity with 10
	~Stack();
	void push(T element);
	T pop();  // 弹出栈顶元素值
	T top();  // 获取顶端元素值	
	int getsize() const; // 获取栈的内存大小
};

2.栈的扩容

template<typename T>
void Stack<T>::resize() {
	int newcapacity = capacity * 2;
	T* newData = new T[newcapacity]; // 申请新地址
	for (int i = 0; i < size; i++) {
		newData[i] = data[i];
	}
	delete[] data;
	data = newData;
	capacity = newcapacity;
}

3.栈的析构(初始化)

template<typename T>
Stack<T>::~Stack() {
	delete[] data;
}

template<typename T>
void Stack<T>::push(T element) {
	if (size == capacity)
		resize();
	data[size++] = element;
}

4.入栈

template<typename T>
void Stack<T>::push(T element) {
	if (size == capacity)
		resize();
	data[size++] = element;
}

5.出栈

template<typename T>
T Stack<T>::pop() {
	if (size == 0) {
		throw underflow_error("Stack is empty"); // Added missing semicolon and fixed the exception class name
	}
	return data[--size];
}

6.栈顶元素

template<typename T>
T Stack<T>::top() {
	if (size == 0) {
		throw underflow_error("Stack is empty"); // Added missing semicolon and fixed the exception class name
	}
	return data[size - 1];
}

7.获取栈的内存大小

template<typename T>
int Stack<T>::getsize() const {
	return size;
}

【运行结果】

int main() {
	Stack<int> st;
	st.push(1);
	for (int j = 1; j <= 5; j++) {
		st.push(j);
	}
	cout << st.top() << endl;
	cout << st.getsize();

	return 0; 
}

链表实现栈

【代码解析】

1.链表创建栈

#include<iostream>
#include<stdexcept>
using namespace std;

template<typename T>
class Stack {
private:
	struct Node {
		T data;
		Node* next;
		Node(T d) :data(d), next(NULL) {}	//节点构造
	};
		Node* head;	  //栈顶元素的指针(链表头)
		int size;
public:
	Stack():head(NULL),size(0){}
	~Stack();
	void push(T element);
	T pop();
	T top();
	int getsize();
	};
	

2.栈的析构(初始化)

template<typename T>
Stack<T>::~Stack() {
	while (head) {
		Node* temp = head;
		head = head->next;
		delete temp;
	}
}

3.入栈

template<typename T>
void Stack<T>::push(T element) {
	Node* newNode = new Node(element);
	newNode->next = head;
	head = newNode;
	size++;
};

4.出栈

template<typename T>
T Stack<T>::pop() {
	if (head == NULL) {
		throw underflow_error("Stack is empty");
	}
	T data = head->data;
	Node* temp = head;
	head = head->next;
	delete temp;
	size--;
	return data;
}

5.栈顶元素

template<typename T>
T Stack<T>::top() {
	if (head == NULL) {
		throw underflow_error("Stack is empty");
	}
	return head->data;
}

6.获取栈的内存的大小

template<typename T>
int Stack<T>::getsize() {
	return size;
}

【运行结构】

int main() {
	Stack<int> st;
	st.push(4);
	st.push(5);
	cout << st.top() << endl;
	cout << st.getsize();

}

STL中的栈

【代码解析】

#include<iostream>
#include<stack>
using namespace std;

int main() {
	stack<int>st;
	for (int i = 0; i <= 10; i ++)
	{
		st.push(i);
	}
	while (!st.empty())
	{
		cout << st.top() << " ";
		st.pop();
	}
}

1.调用<stack>.h

#include<stack>

2.创建stack(其中st为stack的名称)

stack<int> st;         //<>中填入栈的类型,后方填入栈的名称

3.入栈

st.top()

4.出栈

st.pop()

5.栈顶元素

st.top()

6.判断栈是否为空

st.empty()

【运行结果】

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值