《C++实现数据结构》:堆栈

来源:互联网 发布:导航源码 编辑:程序博客网 时间:2024/05/20 08:22

堆栈是限定插入和删除操作都在表的同一端进行的线性表,是后进先出(LIFO)的线性数据结构。

#include <iostream>using namespace std;//堆栈基类template <typename T>class Stack{public:    virtual bool IsEmpty() const = 0;   //若栈空,则返回true    virtual bool IsFull() const = 0;    //若栈满,则返回true    virtual bool Top(T &x) const = 0;   //在x中返回栈顶元,若操作成功,则返回true    virtual bool Push(T x) = 0;         //在栈顶插入元素x(入栈),若操作成功,则返回true    virtual bool Pop() = 0;             //从栈中删除栈顶元素(出栈),若操作成功,则返回true    virtual void Clear() = 0;           //清除栈中全部元素};

一、堆栈的顺序表示
和线性表的顺序表示一样,是用数组来构造的。

//堆栈的顺序表示template <typename T>class SeqStack:public Stack<T>{private:    int top;        //栈顶指针    int maxTop;     //最大栈顶指针    T* s;public:    SeqStack(int mSize);    ~SeqStack();    bool IsEmpty() const;   //若栈空,则返回true    bool IsFull() const;    //若栈满,则返回true    bool Top(T &x) const;   //在x中返回栈顶元,若操作成功,则返回true    bool Push(T x);         //在栈顶插入元素x(入栈),若操作成功,则返回true    bool Pop();             //从栈中删除栈顶元素(出栈),若操作成功,则返回true    void Clear();           //清除栈中全部元素};template <typename T>SeqStack<T>::SeqStack(int mSize) {    maxTop = mSize - 1;    s = new T[mSize];    top = -1;}template <typename T>SeqStack<T>::~SeqStack() {    delete[] s;}template <typename T>bool SeqStack<T>::IsEmpty() const {    return -1 == top;}template <typename T>bool SeqStack<T>::IsFull() const {    return top == maxTop;}template <typename T>bool SeqStack<T>::Top(T &x) const {    if (IsEmpty()) {        cout<<"Empty"<<endl;        return false;    }    x= s[top];    return true;}template <typename T>bool SeqStack<T>::Push(T x) {    if (IsFull()) {        cout << "Full" << endl;        return false;    }    s[++top] = x;    return true;}template <typename T>bool SeqStack<T>::Pop() {    if (IsEmpty()) {        cout<<"Empty"<<endl;        return false;    }    top--;    return true;}template <typename T>void SeqStack<T>::Clear() {    top = -1;}

二、堆栈的链接表示
表头指针的next永远指向栈顶。

//堆栈的链接表示template <typename T>class SingleStack;template <typename T>class Node{private:    T element;    Node<T>* next;    friend class SingleStack<T>;};template <typename T>class SingleStack:public Stack<T>{private:    Node<T>* head;    bool IsFull() const{};public:    SingleStack();    ~SingleStack();    bool IsEmpty() const;   //若栈空,则返回true    bool Top(T &x) const;   //在x中返回栈顶元,若操作成功,则返回true    bool Push(T x);         //在栈顶插入元素x(入栈),若操作成功,则返回true    bool Pop();             //从栈中删除栈顶元素(出栈),若操作成功,则返回true    void Clear();           //清除栈中全部元素};template <typename T>SingleStack<T>::SingleStack() {    head = new Node<T>;    head->next = NULL;}template <typename T>SingleStack<T>::~SingleStack() {    Node<T> *p;    while (head != NULL) {        p = head;        head = head->next;        delete (p);    }}template <typename T>bool SingleStack<T>::IsEmpty() const {    if (head->next == NULL) {        return true;    } else {        return false;    }}template <typename T>bool SingleStack<T>::Top(T &x) const {    if (IsEmpty()) {        cout<<"Empty"<<endl;        return false;    }    x = head->next->element;    return true;}template <typename T>bool SingleStack<T>::Push(T x) {    Node<T>* newNode = new Node<T>;    newNode->element = x;    newNode->next = head->next;    head->next = newNode;}template <typename T>bool SingleStack<T>::Pop() {    if (IsEmpty()) {        cout<<"Empty"<<endl;        return false;    }    Node<T>* p = head->next;    head->next = p->next;    delete (p);}template <typename T>void SingleStack<T>::Clear() {    Node<T> *p = head->next;    head->next = NULL;    Node<T> *q;    while (p != NULL) {        q = p;        p = p->next;        delete (q);    }}

最后的测试用例:

int main() {    int n = 10;    Stack<int> *stack = new SeqStack<int>(10);    //Stack<int> *stack = new SingleStack<int>();    for (int i = 0; i < 5; ++i) {        stack->Push(i);    }    int x;    if (stack->Top(x)) {        cout<<"top:"<<x<<endl;    }    stack->Pop();    if (stack->Top(x)) {        cout<<"now top:"<<x<<endl;    }    return 0;}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 公司搬走注册地怎么办 注册公司没有房产证怎么办 公司不运营了怎么办 公司注销了账户怎么办 租户不变更地址怎么办 营业执照忘审了怎么办 工商营业执照年检过期怎么办 个体营业执照没有年报怎么办? 个体工商户一年没有申报怎么办 个体工商户逾期未申报怎么办 个体户没报税过怎么办 农业银行证书过期了怎么办 ca证书丢了怎么办 ca证书被锁怎么办 上个月忘记清卡怎么办 财务人员进入税务黑名单怎么办 社保本丢了怎么办 贷款车辆登记证书怎么办 发票薄丢了怎么办? 汽车发票丢了怎么办 税票弄丢了怎么办 交强险正本丢了怎么办 个体营业执照正本丢失怎么办 简易注销后税务怎么办 拒绝了日历邀请怎么办 老人走丢了怎么办 老人走丢找不到怎么办 没人给介绍对象怎么办 bate365账号被锁怎么办 qq号疑似被盗怎么办 不知道音乐名字怎么办 忘记支付宝登录怎么办 微信被老婆拉黑怎么办 微信群昵称改不了怎么办 微信号设置不了怎么办 修改微信号点不开怎么办 多屏设置失败怎么办 icould密码忘了怎么办 微信号换不了怎么办 微信号改不了怎么办? 无法设置微信号怎么办