基本知识
栈(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()