通用的链栈实现(C++)

template<class T>
class MyStack//链栈
{
private:
    struct StackNode
    {
        T data;
        StackNode* next;
        StackNode(const T& val = T(), StackNode* p = nullptr) :data(val), next(p) {}
        //
    };
    StackNode* top;
    int cursize;
    void clone(const MyStack& s)
    {
        Clear();
        cursize = s.cursize;
       
        StackNode* p = s.top;
        if (p == nullptr)return;
        top = new StackNode(p->data);
        StackNode* tail = top;
        p = p->next;
        while (p != nullptr)
        {
            tail=tail->next = new StackNode(p->data);
            p = p->next;
        }
    }
public:
    MyStack():cursize(0), top(nullptr) {}
    MyStack(const MyStack& s) :top(nullptr), cursize(s.cursize)
    {
        clone(s);
     }
    MyStack& operator=(const MyStack& s)
    {
        if (this != &s)
        {
           
            clone(s);
            
        }
        return *this;
    }
    ~MyStack()
    {
        Clear();
    }
    void Clear()
    {
        while (top != nullptr)
        {
            StackNode* q = top;
            top = q->next;
            delete q;
        }
        cursize = 0;
    }
    int Size()const
    {
        return cursize;
    }
    bool Empty()const
    {
        return Size() == 0;
    }
    void  Push(const T& val)//入栈
    {
        top = new StackNode(val, top);//头插
        cursize += 1;


    }
    const T& Top()const//返回栈顶元素
    {
        return top->data;
    }
    void Pop()//出栈
    {
        StackNode* q = top;
        top = q->next;
        delete q;
        cursize -= 1;

    }
    bool GetTop(T& val)//得到栈顶元素并出栈
    {
        if (Empty())return false;
        val = top->data;
        StackNode* q = top;
        top = q->next;
        delete q;
        cursize -= 1;
        return true;

    }

};

int main()
{
    MyStack<char>cmys;
    MyStack<int>imys;
    MyStack<double> dmys;

    for (char c = 'a'; c < 'z'; c++)
    {
        cmys.Push(c);
    }
    char val;
    while (cmys.GetTop(val))
    {
        cout << val << endl;
    }
    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我来为您介绍一下如何使用链栈实现简易计算器。 首先,我们需要定义一个链栈的结构体,包括数据域和指针域: ``` struct Node { double data; Node* next; }; ``` 然后,我们需要定义一些基本的操作,如入栈、出栈、获取栈顶元素等: ``` void push(Node*& top, double data) { Node* newNode = new Node; newNode->data = data; newNode->next = top; top = newNode; } double pop(Node*& top) { if (top == nullptr) { throw "Stack is empty!"; } double data = top->data; Node* temp = top; top = top->next; delete temp; return data; } double peek(Node* top) { if (top == nullptr) { throw "Stack is empty!"; } return top->data; } ``` 接下来,我们可以利用这些基本操作来实现一个简易计算器。具体实现方法如下: 1. 读入一个表达式,将其中的数字和运算符分别入栈。 2. 当遇到一个运算符时,弹出栈顶的两个数字进行计算,并将结果入栈。 3. 重复步骤2,直到表达式中的所有运算符都被处理完毕。 4. 最终栈中剩下的数字就是表达式的计算结果。 下面是一个示例代码: ``` double calculate(string expression) { Node* stack = nullptr; for (int i = 0; i < expression.length(); i++) { if (isdigit(expression[i])) { double num = 0; while (i < expression.length() && isdigit(expression[i])) { num = num * 10 + (expression[i] - '0'); i++; } push(stack, num); i--; } else if (expression[i] == '+' || expression[i] == '-' || expression[i] == '*' || expression[i] == '/') { double num1 = pop(stack); double num2 = pop(stack); switch (expression[i]) { case '+': push(stack, num2 + num1); break; case '-': push(stack, num2 - num1); break; case '*': push(stack, num2 * num1); break; case '/': push(stack, num2 / num1); break; } } } double result = pop(stack); if (stack != nullptr) { throw "Invalid expression!"; } return result; } ``` 这样,我们就实现了一个简易的计算器。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我在凌晨等太阳¤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值