C++练习题3

要求: 完成顺序栈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;
}

猜你喜欢

转载自blog.csdn.net/m0_62526778/article/details/129988886