本文回顾了作者在大学时期学习栈时遇到的挑战,并分享了使用C++和Python实现栈的经验。通过重新阅读C++ Primer,作者编写了一个模板类来实现栈,并讨论了栈的基本操作和分类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

又开始看栈了。虽然是最简单的数据结构之一,依然记得大一下学期的时候为了想用C++写一个栈的类。。碰到各种诡异的语法错误之后信心全无,最后放弃了。从此对C++没什么好感,为什么会有这么多复杂的特性和麻烦的语法。所以本来是打算用Python实现一个的,不过写着写着发现人家的List已经完全实现栈的功能了,写个蛋啊。。失望

遂又决定把C++拣回来,大一买的C++ Primer已经好久没看了,下午又拿出来翻了好久,倒腾半天写出一个模板类,蛋疼的语法依旧蛋疼,不过还好咱的耐心也不是当年了。=。=

不说了,人越老越喜欢吐槽。。什么情况。


栈是一种动态集合,遵循——LAST IN FIRST OUT(LIFO)的法则,后进先出。像我堆在桶里的臭袜子一样,先放进去的最后会被压在最底下,最后放进去的在顶上,每次只能取出最上面的一只(把手伸进底下强行拿,后果不堪设想啊=。=)。既然是动态集合,就有两种基本的操作,添加和删除,对于LIFO来说,添加操作被称为PUSH,删除操作被称为POP,都是对当前栈顶进行操作,PUSH将对象压入栈的最顶端,而POP讲原来栈顶的元素弹出。所以,实现栈的时候,一个关键的数据就是当前栈的位置,称为TOP。

另外吐槽一下,栈因为一些细节分为四类。栈地址从高到低还是从低到高,栈顶指针指向的位置是空还是满,就有了递增满栈,递减空栈等。

下面的实现是根据算法导论上的描述写的,属于满栈,至于递增还是递减忘了。。貌似IA32指令集都是递减的栈?


// A stack template

#ifndef  _STACK_H_
#define  _STACK_H_ 

#include <iostream>

template <class T>
class Stack
{
    private:
        int top;
        T*  array;
    public:
        Stack(){top = -1;}
        Stack(int size);
        ~Stack();
        void push(T val);
        T pop();
        bool isEmpty();
};

template <class T>
Stack<T>::Stack(int size)
{
    top = -1;
    array = new T[size];                 
}

template <class T>   // 2012/01/10 添加析构函数
Stack<T>::~Stack()
{
    delete [] array;   
}

template <class T>
bool Stack<T>::isEmpty()
{
    return top == -1;
}

template <class T>
void Stack<T>::push(T val)
{
    array[++top] = val;
}

template <class T>
T Stack<T>::pop()
{
    if(isEmpty())
    {
        std::cout << "Stack is empty!" << std::endl;
        exit(EXIT_FAILURE);
    }
    else
    {
        return array[top--];
    }   
}

#endif

这栈写得非常简单,栈顶是否溢出都没检查。。不知道以后能用的上不,有需要再改吧微笑

转载于:https://www.cnblogs.com/leavingQ/archive/2012/01/09/2317511.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值