实现链式栈

栈作为一种数据结构,它按照后进先出的原则存储数据,只能在栈顶进行插入和删除操作的特殊线性表。

按照存储方式不同,栈可以分为顺序栈和链式栈。

实现链式栈需要注意:
(1)采用链表存储结构;
(2)不需要预定义内存空间,不存在“链式栈满”这种情况;
(3)解决了顺序栈中没有合理分配内存大小的难题。

以下为具体实现代码, 在vs2010上测试通过:

#include <iostream>
#include <math.h>

struct node
{
    int data;
    node* next;
};

class myStack
{
public:
    myStack();
    ~myStack();

    bool empty();
    //用链表实现栈,不存在栈满这种情况
    bool getTopElement(int &x);
    bool push(int x);
    bool pop();
    int size();

private:
    int count;
    node* top;
};

int _tmain(int argc, _TCHAR* argv[])
{
    myStack sta;
    bool flag = sta.empty();//判断栈是否为空
    if(flag)
    {
        for(int i = 0; i < 5; i++)
            sta.push(i);//入栈
    }

    int x;
    int nsize;
    while(!sta.empty())
    {
        nsize = sta.size();
        sta.getTopElement(x);//x = 4, 访问栈顶元素
        sta.pop();//栈顶元素出栈
    }

    return 0;
}

myStack::myStack()
{
    count = 0;
    top = NULL;//栈顶指针置空,当元素入栈后,栈顶指针才有具体指向
}

bool myStack::empty()
{
    if(count == 0)
        return true;
    else
        return false;
}

bool myStack::getTopElement(int &x)
{
    if(empty())
        return UNDERFLOW;
    else
    {
        x = top->data;
        return true;
    }
}

bool myStack::push(int x)
{
    node* p = new node;//新建结构体对象
    p->data = x;
    p->next = top;//确定p的下一个结点
    top = p;//更新栈顶指针的指向
    count++;//元素个数增加
    return true;
}

bool myStack::pop()//该函数容易出错
{
    if(empty())
        return UNDERFLOW;//提示范围溢出
    else
    {
        node* temp = new node;
        temp = top;//temp指向待删除结点(pop()删除头结点)
        top = temp->next;//跳过待删除结点
        delete temp;
        count--;//减少元素个数
        return true;
    }
}

int myStack::size()
{
    return count;
}

myStack::~myStack()//逐个释放栈中的元素
{
    while(!empty())
        pop();
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值