要求: 完成顺序栈SeqStack和链栈LinkStack的入栈,出栈,读取栈顶元素,和判空操作。要求将以前主函数main内容注释,写新的主函数,可先写顺序栈的主函数和头文件运行无误后;再写链栈的头文件和主函数,其主函数部分可以通过注释顺序栈的内容来完成。最后调试和检查程序可运行后。
SeqStack.h
- 顺序栈的头文件
#ifndef SEQSTACK_H
#define SEQSTACK_H
#include <iostream>
#include <vector>
template <typename T>
class SeqStack {
public:
SeqStack() = default;
// 入栈操作
void push(const T& value) {
data.push_back(value); // 将元素添加到栈顶(vector末尾)
}
// 出栈操作
void pop() {
if (!isEmpty()) {
data.pop_back(); // 移除栈顶元素(vector末尾)
} else {
std::cerr << "Stack is empty!" << std::endl;
}
}
// 读取栈顶元素
T top() const {
if (!isEmpty()) {
return data.back(); // 返回栈顶元素(vector末尾)
} else {
std::cerr << "Stack is empty!" << std::endl;
return T();
}
}
// 判断栈是否为空
bool isEmpty() const {
return data.empty(); // 栈为空当且仅当底层vector为空
}
private:
std::vector<T> data; // 使用vector作为底层数据结构存储栈内元素
};
#endif // SEQSTACK_H
LinkStack.h
- 链栈的头文件:
#ifndef LINKSTACK_H
#define LINKSTACK_H
#include <iostream>
template <typename T>
class LinkStack {
public:
LinkStack() : topNode(nullptr) {} // 构造函数,初始化栈顶指针为nullptr
~LinkStack() {
// 析构函数,释放栈内所有节点的内存
while (topNode) {
Node* temp = topNode;
topNode = topNode->next;
delete temp;
}
}
// 入栈操作
void push(const T& value) {
// 创建新节点,将新节点链接到原栈顶,并更新栈顶指针
Node* newNode = new Node(value, topNode);
topNode = newNode;
}
// 出栈操作
void pop() {
if (!isEmpty()) {
// 移除栈顶节点,释放内存,并更新栈顶指针
Node* temp = topNode;
topNode = topNode->next;
delete temp;
} else {
std::cerr << "Stack is empty!" << std::endl;
}
}
// 读取栈顶元素
T top() const {
if (!isEmpty()) {
return topNode->data; // 返回栈顶节点的数据
} else {
std::cerr << "Stack is empty!" << std::endl;
return T();
}
}
// 判断栈是否为空
bool isEmpty() const {
return topNode == nullptr; // 栈为空当且仅当栈顶指针为nullptr
}
private:
struct Node {
T data;
Node* next;
// 节点构造函数,初始化数据和next指针
Node(const T& data, Node* next) : data(data), next(next) {}
};
Node* topNode; // 栈顶指针,指向链表中的栈顶节点
};
#endif // LINKSTACK_H
main.cpp
#include <iostream>
#include "SeqStack.h"
#include "LinkStack.h"
int main() {
// 顺序栈的使用
SeqStack<int> seqStack;
// 将元素1、2、3分别入栈
seqStack.push(1);
seqStack.push(2);
seqStack.push(3);
std::cout << "顺序栈操作:" << std::endl;
// 输出栈顶元素,然后出栈,直到栈为空
while (!seqStack.isEmpty()) {
std::cout << "栈顶元素: " << seqStack.top() << std::endl;
seqStack.pop();
}
// 链栈的使用
LinkStack<int> linkStack;
// 将元素1、2、3分别入栈
linkStack.push(1);
linkStack.push(2);
linkStack.push(3);
std::cout << "链栈操作:" << std::endl;
// 输出栈顶元素,然后出栈,直到栈为空
while (!linkStack.isEmpty()) {
std::cout << "栈顶元素: " << linkStack.top() << std::endl;
linkStack.pop();
}
return 0;
}