使用C++模版实现一个模版栈,并将中缀字符串计算式转化为逆波兰表达式,实现一个简单计算器功能。计算器有 + - * / ,支持负号,不支持小数,数字范围为 int 类型的取值范围。![](https://img-blog.csdn.net/20170728122352039?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGFoYXpoYW5neXUwMzEw/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
下面为代码:
stack_template.h
#ifndef _MY_STACK_H
#define _MY_STACK_H
#include <stdexcept>
template<class T>
struct stackNode
{
T data;
stackNode<T> *prev;
stackNode() {}
stackNode(const T& data) : data(data), prev(nullptr){}
stackNode(const T& data, stackNode<T>* prev) : data(data), prev(prev){}
};
template<class T>
class my_stack
{
public:
my_stack() : stackSize(0), stackTop(nullptr){}
my_stack(T& data) : stackSize(1), stackTop(stackNode<T>(data)){}
bool isEmpty() const { return stackSize == 0; }
unsigned int size() const { return stackSize; }
void push(const T& data);
void pop();
T& top() const;
private:
unsigned int stackSize;
stackNode<T> *stackTop;
};
template<class T>
void my_stack<T>::push(const T& data)
{
stackNode<T> *newNode = new stackNode<T>(data, stackTop);
stackTop = newNode;
++stackSize;
}
template<class T>
void my_stack<T>::pop()
{
if (isEmpty())
throw std::range_error("Stack is empty,can't pop");
stackNode<T> *temp = stackTop;
stackTop = stackTop->prev;
delete temp;
--stackSize;
}
template<class T&