数据结构---栈(C++版)

概念

(Stack) 是仅限在表尾进行插入和删除的 线性表,它遵循 后进先出(Last-In-First-Out,LIFO)的原则。栈可以类比为一叠盘子,你只能访问顶部的盘子,而添加或删除盘子只在顶部进行。

  • 栈顶(Top) :线性表允许进行插入删除的那一端。
  • 栈底(Bottom):固定的,不允许进行插入和删除。

栈

​ 在计算机科学中, 通常用于实现 函数调用递归表达式求值 等操作。我们一般可以用 顺序表 或者 链表 来实现栈。

栈的实现(C++)

入出栈

引入库

#include<iostream>
#include<stdexcept>

using namespace std;

有入栈、出栈、获取栈顶元素、获取栈的数量。

定义模板类

template<typename T>是C++中的模板类型,可以套用任意类型。

template<typename T>
class Stack {
private:
	T* data;
	int size;
	int capacity;
	void resize();

public:
    //析构函数
	Stack() : data(new T[10]), size(0), capacity(10) {}
	~Stack();
	void push(T element);
	T pop();
	T top() const;
	int getSize() const;
};

Stack内部定义了一个扩容函数属于私有,只可内部函数调用

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;
}

自动释放函数

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

一、入栈

  • 概念

​ 栈元素的插入操作叫做入栈,也可称为进栈、压栈。直接将元素添加到栈的顶部即可。这个操作类似将盘子添加到叠盘子的顶部。

  • 步骤
  1. 将元素压入栈中,并将栈顶指针或索引指向新的栈顶元素。
  2. 栈的 Size 增加了 1 ,顶部元素为刚刚入栈的元素。
template<typename T>
void Stack<T>::push(T element) {
	if (size == capacity) {
		resize();
	}
	data[size++] = element;
}

二、出栈

  • 概念

​ 栈元素的删除操作叫做出栈,也可称为弹栈。直接将栈的顶部元素删除即可。这个操作类似于将叠盘子的顶部盘子拿走的过程。

  • 步骤
  1. 将栈顶元素删除掉,并将栈顶指针或索引指向新的栈顶元素。
  2. 栈的 Size1
template<typename T>
T Stack<T>::pop() {
	if (size == 0) {
		throw std::underflow_error("Stack is empty");
	}
	return data[--size];
}

三、获取栈顶元素

  • 概念

​ 返回栈顶元素的值,无论是链表还是顺序表,都可以通过栈顶指针在 O(1) 的时间复杂度获取到栈顶元素。

  • 步骤
  1. 利用栈顶指针获取栈顶元素。
template<typename T>
T Stack<T>::top() const {
	if (size == 0) {
		throw std::underflow_error("Stack is empty");
	}
	return data[size - 1];
}
  • 获取栈的大小
template<typename T>
int Stack<T>::getSize() const {
	return size;
}

四、调试

int main() {
	Stack<int> st;
	st.push(4);
	st.push(7);
	st.push(10);
	cout << st.top() << endl;
	st.push(147);
	cout << st.top() << endl;
	st.pop();
	st.pop();
	cout << st.top() << endl;
	cout << st.getSize() << endl;

	return 0;
}

C++ STL 库 stack 的应用

  • 头文件
#include<iostream>
#include<stack>
  • 定义
stack<T>st;
----------------------------------------------
    数据类型
>>>int float char string node(结构体)...
  • 基本操作
s.empty()  //栈空返回true,否则返回false
s.size()   //返回栈中元素的个数
s.pop()	   //删除栈顶元素    
s.top()	   //返回栈顶元素
s.push()   //在栈顶压入新元素

总结及完整代码

这篇是看英雄哥自我学习C++代码,做的笔记记录下来,作为C++的学习和加深对数据结构的理解,和同学们一起分享,希望可以一起学习,考研必胜,栈是先进先出,持续更新中!!!加油!!!

#include<iostream>
#include<stdexcept>

using namespace std;

template<typename T>
class Stack {
private:
	T* data;
	int size;
	int capacity;
	void resize();

public:
	Stack() : data(new T[10]), size(0), capacity(10) {}
	~Stack();
	void push(T element);
	T pop();
	T top() const;
	int getSize() const;
};

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;
}

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

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

template<typename T>
T Stack<T>::pop() {
	if (size == 0) {
		throw std::underflow_error("Stack is empty");
	}
	return data[--size];
}

template<typename T>
T Stack<T>::top() const {
	if (size == 0) {
		throw std::underflow_error("Stack is empty");
	}
	return data[size - 1];
}

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

int main() {
	Stack<int> st;
	st.push(4);
	st.push(7);
	st.push(10);
	cout << st.top() << endl;
	st.push(147);
	cout << st.top() << endl;
	st.pop();
	st.pop();
	cout << st.top() << endl;
	cout << st.getSize() << endl;

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值