SeqStack.hpp
#include<iostream>
using namespace std;
template <class T, int Maxsize >
class SeqStack
{
T data[Maxsize];//存放栈元素的数组
int top;//栈顶指针,指示栈顶元素在数组中的下标public:
public:
SeqStack();//构造函数
void Push(T x);//入栈
int Stacktop();//返回栈顶元素
T Pop();//出栈
T Top();//取栈顶元素(元素并不出栈)
bool Empty();//判断栈是否为空
bool Full();
int Length();
};
template<class T, int Maxsize>
SeqStack<T, Maxsize>::SeqStack()
{
top = -1;
}
template<class T, int Maxsize>
void SeqStack<T, Maxsize>::Push(T x)
{
if (top == Maxsize - 1)
{
cout << "上溢" << endl;
exit(1);
}
data[++top] = x;
}
template<class T, int Maxsize>
T SeqStack<T, Maxsize>::Pop()
{
if (top == -1)
{
cout << "下溢" << endl;
exit(1);
}
top--;
return data[top + 1];
}
template<class T, int Maxsize>
T SeqStack<T, Maxsize>::Top()
{
return data[top];
}
template<class T, int Maxsize>
int SeqStack<T, Maxsize>::Stacktop()
{
return top;
}
template<class T, int Maxsize>
bool SeqStack<T, Maxsize>::Full()
{
if (top == Maxsize - 1)
return true;
}
template<class T, int Maxsize>
bool SeqStack<T, Maxsize>::Empty()
{
if (top == -1)
return true;
}
template<class T, int Maxsize>
int SeqStack<T, Maxsize>::Length()
{
return top + 1;
}
test.h
#include<iostream>
#include"SeqStack.hpp"
using namespace std;
const char Oper[7][7] = { '>','>','<','<','<','>','>',
'>','>','<','<','<','>','>',
'>','>','>','>','<','>','>',
'>','>','>','>','<','>','>',
'<','<','<','<','<','=',' ',
'>','>','>','>',' ','>','>',
'<','<','<','<','<',' ','=' };
int OperOcca(char oper)
{
switch (oper)
{
case '+':
return 0;
case '-':
return 1;
case '*':
return 2;
case '/':
return 3;
case '(':
return 4;
case ')':
return 5;
case '\n':
return 6;
}
}
char Precede(char a, char b)
{
int m = OperOcca(a);
int n = OperOcca(b);
return Oper[m][n];
}
double Operate(double left, char a, double right)
{
switch (a)
{
case '+':return left + right;
case '-':return left - right;
case '*':return left * right;
case '/':return left / right;
}
}
bool isCharacter(char ch)
{
if (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '(' || ch == ')' || ch == '\n')
return true;
else
return false;
}
class Calculate
{
SeqStack<char, 1000>OPTR; //操作符栈
SeqStack<double, 1000>OPND; //操作数栈
public:
double Cal(string str);
};
double Calculate::Cal(string str)
{
SeqStack<char, 100> OPTR; //操作符栈
SeqStack<double, 100> OPND; //数栈
OPTR.Push('\n');
cout << "请输入一个算术表达式:";
char ch = getchar();
bool flag = 0;
while (ch != '\n' || OPTR.Top() != '\n')
{
if ((ch >= '0' && ch <= '9') || ch == '.')
{
double sum = 1;
double num = 0;
while ((ch >= '0' && ch <= '9') || ch == '.')
{
if (ch == '.')
{
flag = 1;
ch = getchar();
continue;
}
if (flag)
{
sum /= 10;
num += sum * ((double)ch - '0');
}
else
num = num * 10 + ch - '0';
ch = getchar();
}
OPND.Push(num);
flag = 0;
}
else if (isCharacter(ch))
{
char pre_op = OPTR.Top();
switch (Precede(pre_op, ch))
{
case '<':
OPTR.Push(ch);
ch = getchar();
break;
case '=':
OPTR.Pop();
ch = getchar();
break;
case '>':
double right;
double left;
right = OPND.Pop();
left = OPND.Pop();
char pre_op = OPTR.Pop();
OPND.Push(Operate(left, pre_op, right));
break;
}
}
else
{
cout << "表达式有非法字符" << endl;
exit(1);
}
}
cout << "结果为:" << OPND.Top() << endl;
}
main.cpp
#include<iostream>
#include"SeqStack.hpp"
#include"test.h"
using namespace std;
int main()
{
string experssion;
cout << "请输入一个算术表达式:" << endl;
cin >> experssion;
Calculate cal;
cal.Cal(experssion);
return 0;
}