|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
#include<iostream>
#include<string>
using namespace std;
template<typename T>
class myStack {
private:
enum { SIZE = 10 };
T data[SIZE];
int nTop;
public:
myStack() { nTop = -1; }
~myStack();
bool isEmpty();
bool isFull();
bool push(const T& v);
T pop();
T top()const;
};
template<typename T>
myStack<T>::~myStack()
{}
template<typename T>
bool myStack<T>::isEmpty()
{
if (nTop = -1)
return true;
else
return false;
}
template<typename T>
bool myStack<T>::isFull()
{
if (nTop == SIZE - 1)
return true;
else
return false;
}
template<typename T>
bool myStack<T>::push(const T& v)
{
if (isFull())
return false;
data[++nTop] = v;
return true;
}
template<typename T>
T myStack<T>::pop()
{
if (isEmpty())
return false;
nTop--;
return data[++nTop];
}
template<typename T>
T myStack<T>::top()const
{
return data[nTop];
}
int pri(char op)//获得数值化的运算符优先级,用以比较运算符优先级
{
switch (op)
{
case '+': return 4;
case '-': return 4;
case '*': return 8;
case '/': return 8;
}
return 0;
}
bool getTwoOperatorands(int& op1, int& op2, myStack<int> digitStack)//获得两个操作数
{
if (digitStack.isEmpty())
return false;
op1 = digitStack.pop();
if (digitStack.isEmpty())
return false;
op2 = digitStack.pop();
return true;
}
bool compute(myStack<int> digitStack, myStack<char> opStack)//计算一次,得到一个结果。数字栈出两个数字,符号栈出一个符号
{
int result;
int op1, op2;
if (opStack.isEmpty())
return false;
char op = opStack.pop();
if (getTwoOperatorands(op1, op2, digitStack) == false)
return false;
switch (op)
{
case'+':result = op1 + op2; break;
case'-':result = op1 - op2; break;
case'*':result = op1 * op2; break;
case'/':if (op2 == 0)return false;
result = op1 / op2; break;
default:return false;
}
digitStack.push(result);//计算结果入栈
return true;
}
int expreCalculation(string str, myStack<int> digitStack, myStack<char> opStack)//计算表达式最后的结果
{
int lastResult;
for (int i = 0; i < str.length();)
{
if (str[i] >= '0' && str[i] <= '9')
digitStack.push(str[i++] - '0');
else {
while (!opStack.isEmpty() && pri(str[i]) <= pri(opStack.top()))
{
if (!compute(digitStack, opStack))
return false;
}
opStack.push(str[i++]);
}
}
compute(digitStack, opStack);
lastResult = digitStack.pop();
return lastResult;
}
int main()
{
int result;
string str;
myStack<int> digitStack;
myStack<char> opStack;
result = expreCalculation("3+2", digitStack, opStack);
cout << "结果:" << result << endl;
cin.get();
return 0;
}
[/code]
最后的结果总是0,看了好长时间还是没找出bug在哪。。。 |
|