顺序栈
使用数组实现
代码
#include <iostream>
#include <string.h>
using namespace std;
class SeqStack {
public:
SeqStack(int size=10)
: mTop(0)
, mCap(size)
{
mpStack = new int[size];
}
~SeqStack()
{
delete[] mpStack;
mpStack = nullptr;
}
public:
// 入栈
void push(int val) {
if (mTop == mCap) {
// 栈满了,需要进行扩容操作
expand(2 * mCap);
}
// 开始入栈
mpStack[mTop] = val;
mTop++;
}
// 出栈
void pop() {
if (mTop == 0) {
// 栈为空
throw "stack is empty";
}
mTop--;
}
// 获取栈顶元素
int top() const {
if (mTop == 0) {
// 栈为空
throw "Stack is empty";
}
return mpStack[mTop - 1];
}
// 判断栈是否为空
bool empty() const {
return mTop == 0;
}
// 栈中元素的个数
int size() const {
return mTop;
}
private:
void expand(int size) {
int* p = new int[size];
memcpy(p, mpStack, mTop * sizeof(int)); // memcpy是按字节拷贝的,因此需要mTop * sizeof(int)
delete[] mpStack;
mpStack = p;
mCap = size;
}
private:
int* mpStack;
int mTop; // 栈顶位置
int mCap; // 栈空间大小
};
测试
代码
int main() {
int arr[] = {12, 45, 78,98, 34, 45};
SeqStack s;
for (int v : arr) {
s.push(v);
}
while (!s.empty())
{
cout << s.top() << " ";
s.pop();
}
cout << endl;
return 0;
}
测试结果
➜ build git:(main) ✗ ./SeqStack
45 34 98 78 45 12
链式栈
我们使用链表的头插和头删来创建链式栈
代码
#include <iostream>
#include <string.h>
using namespace std;
class LinkStack {
public:
LinkStack(): size_(0) {
head_ = new Node();
}
~LinkStack() {
Node *p = head_;
while (p != nullptr)
{
head_ = head_->next_;
delete p;
p = head_;
}
}
public:
// 入栈操作
void push(int val) {
Node* node = new Node(val);
node->next_ = head_->next_;
head_->next_ = node;
size_++;
}
// 出栈
void pop() {
if (head_->next_ == nullptr) {
// 栈为空
throw "stack is empty";
}
Node* p = head_->next_;
head_->next_ = p->next_;
delete p;
size_--;
}
// 获取栈顶元素
int top() const{
if (head_->next_ == nullptr) {
// 栈为空
throw "stack is empty";
}
return head_->next_->data_;
}
// 判空
bool empty() const{
return head_->next_ == nullptr;
}
// 返回栈元素个数
int size() const {
return size_;
}
private:
struct Node {
Node(int data = 0): data_(data), next_(nullptr) {};
int data_;
Node* next_;
};
Node* head_;
int size_; // 记录元素个数
};
测试
代码
int main() {
int arr[] = {12, 45, 78,98, 34, 45};
LinkStack s;
for (int v : arr) {
s.push(v);
}
while (!s.empty())
{
cout << s.top() << " ";
s.pop();
}
cout << endl;
return 0;
}
测试结果
➜ build git:(main) ✗ ./LinkStack
45 34 98 78 45 12