实际上也是一种线性结构,可以使用链表进行描述。与之不同的是栈结构的压栈(插入)和弹栈(删除)操作只能基于栈顶的数据元素。故栈是一种先进后出结构。


1.定义结点类

struct StackNode
{
    int val;
    StackNode *next;
    StackNode(int x = 0xFFFF)
        :val(x), next(nullptr) {}
};

2.定义栈类

class LinkedStack
{
public:
    LinkedStack(int len = 0);
    ~LinkedStack();

    bool StackEmpty();
    void StackClear();
    int GetTop();
    void Push(int const e);
    void Pop();
    int GetLen();
    void printStack();

private:
    int StackLen;
    StackNode *StackTop;
};

StackEmpty 方法:判断栈是否为空;

StackClear 方法:清空整个栈;

GetTop 方法:得到栈顶数据元素;

Push 方法:压栈操作;

Pop 方法:弹栈操作;

GetLen 方法:得到栈的长度;

printStack 方法:打印栈。


3.方法实现

LinkedStack::LinkedStack(int len)
    :StackLen(len)
{
    StackTop = new StackNode();
}

LinkedStack::~LinkedStack()
{
    StackClear();
    delete StackTop;
}

bool LinkedStack::StackEmpty()
{
    return StackTop == nullptr;
}

void LinkedStack::StackClear()
{
    StackNode *p = StackTop;
    while (StackTop)
    {
        StackTop = p->next;
        delete p;
        p = StackTop;
    }
}

int LinkedStack::GetTop()
{
    if (StackTop==nullptr)
    {
        return 0xFFFF;
    }
    else
    {
        return StackTop->val;
    }
}

void LinkedStack::Push(int const e)
{
    StackNode *p = new StackNode(e);
    p->next = StackTop;
    StackTop = p;
    StackLen += 1;
}

void LinkedStack::Pop()
{
    StackNode *p = StackTop;
    if (!StackEmpty())
    {
        StackTop = p->next;
        delete p;
    }
}

int LinkedStack::GetLen()
{
    return StackLen;
}

void LinkedStack::printStack()
{
    StackNode *p = StackTop;
    if (StackEmpty())
    {
        return;
    }
    while (p->next)
    {
        std::cout << p->val << std::endl;
        std::cout << "||" << std::endl;
        p = p->next;
    }
    std::cout << p->val << std::endl;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值