代码修改如下:
stack.h 没改:
#pragma once
#include <iostream>
using namespace std;
class stack
{
public:
stack();
~stack();
void clearstack(); //清空
int isempty(); //判空
int length(); //求长度
char gettop(); //取栈顶元素
int push(char); //进栈
int pop(char*); //出栈
int traverse(); //遍历
protected:
int* base; //栈底指针
int* top; //栈顶指针
int size; //
};
stack.cpp(改动不大):
#include "stack.h"
//static int a = 20; //这里不要用静态变量,而且跟计算器.cpp中的全局变量重名了
#define MAXSIZE 20
stack::stack()
{
top = base = new int[MAXSIZE];
size = MAXSIZE;
}
stack::~stack()
{
delete[] base; //修改
}
void stack::clearstack()
{
top = base;
return;
}
int stack::isempty()
{
return top == base ? 1 : 0;
}
int stack::length()
{
return size;
}
char stack::gettop()
{
return *(top - 1);
}
int stack::push(char s)
{
if (top - base == size)
{
cout << "栈已满!" << endl;
return 0;
}
*top = s;
top++;
return 1;
}
int stack::pop(char* s)
{
if (top == base)
{
cout << "栈为空!" << endl;
return 0;
}
*s = *(top - 1);
top--;
return 1;
}
int stack::traverse()
{
for (int i = 1; i <= top - base; i++)
{
cout << (char) * (top - i) << " ";
}
return 1;
}
计算器.cpp:
#include "stack.h"
int prior[5][5] = {
{1,1,2,2,1},
{1,1,2,2,1},
{1,1,1,1,1},
{1,1,1,1,1},
{2,2,2,2,0} };
char a[5] = { '+','-','*','/','#' };
int get(char s)
{
int i = 0;
for (i = 0; i < 5; i++)
{
if (s == a[i]) break;
}
return i;
}
char calculate(stack &s, stack &s1) //修改,用引用
{
char a = '0', b = '0';
char tt;
s.pop(&a);
s.pop(&b);
//上面两个pop最好判断是否成功
if (s1.gettop() == '+') {
s1.pop(&tt);
//s1.traverse();
return a - '0' + b - '0' + '0';
}
else if (s1.gettop() == '-') {
s1.pop(&tt);
//s1.traverse();
return a - '0' + (b - '0') + '0';
}
else if (s1.gettop() == '*') {
s1.pop(&tt);
//s1.traverse();
return (a - '0') * (b - '0') + '0';
}
else if (s1.gettop() == '/') {
s1.pop(&tt);
//s1.traverse();
return (a - '0') / (b - '0') + '0';
}
return 0;
}
int main()
{
stack opnd, optr;
char s[20];
cout << "请输入一个以#开头结尾的表达式:";
cin >> s;
int i = 0;
char a1 = 0; //这个跟全局变量a也重名了
optr.push('#');//把第一个#放入optr
for (i=1; s[i] != '\0';i++) //从1开始
{
if (s[i] >= '0' && s[i] <= '9')
{
opnd.push(s[i]);
}
else
{
while (!optr.isempty())
{
int index = get(optr.gettop());
if (prior[index][get(s[i])] == 1) //这里应该是optr
{
a1 = calculate(opnd, optr);
opnd.push(a1);
}
else if (prior[index][get(s[i])] == 2)
{
optr.push(s[i]);
//optr.traverse();
break;
}
else if (prior[index][get(s[i])] == 0)
{
break;
}
}
}
}
cout << opnd.gettop();
return 0;
}