从屏幕输入运算式子,如1+2*(4-3)/1
输出计算结果,结果不正确,前面创建顺序栈模板都没有问题,不知道后面那里错了
#include "cstdlib"
#include "cstdio"
#include "iostream"
using namespace std;
template <class T> //类模板
class sq_Stack
{
public:
sq_Stack(int c){cap = c;} //构造函数,初始化栈的容量
void create_Stack(); //创建一个顺序栈
int check_Stack(); //检验栈
void enter_Stack(T); //入栈
T quit_Stack(); //退栈
T read_Top(); //读栈顶元素
void show_Stack();
void delete_Stack(); //释放空间
private:
int len; //栈的长度
int cap; //栈的容量
T *s; //指针用于指向开辟的空间
int top; //栈顶指针
};
//创建顺序栈
template <class T>
void sq_Stack<T>::create_Stack()
{
s = new T[cap]; //开辟一个空间,指针指向栈首地址
top = 0;
}
//检验栈
template <class T>
int sq_Stack<T>::check_Stack()
{
if(top == 0) return 0;
else if(top == cap) return -1;
else return 1;
}
//入栈运算
template <class T>
void sq_Stack<T>::enter_Stack(T num)
{
if(top == cap){cout << "上溢错误" << endl;return;} //栈满,发生上溢错误
top++;
s[top-1] = num;
}
//退栈运算
template <class T>
T sq_Stack<T>::quit_Stack()
{
T temp;
if(top == 0){cout << "下溢错误" << endl;return 0;} //发生下溢错误
temp = s[top-1];
top--;
return temp;
}
//读栈顶元素
template <class T>
T sq_Stack<T>::read_Top()
{
if(top == 0){cout << "栈为空" << endl;return 0;} //空栈
return s[top-1];
}
//输出栈
template <class T>
void sq_Stack<T>::show_Stack()
{
int i;
for(i = 0;i<top;i++)
cout << s[i] << " ";
cout << endl;
}
//释放空间
template <class T>
void sq_Stack<T>::delete_Stack()
{
delete []s;
}
double convert(char *,int); //转化字符到数字
int priority(char); //运算符栈的优先级别
int main()
{
sq_Stack<double> OVstack(30); //新建建操作数栈对象
sq_Stack<char> OPstack(30); //新建运算符栈对象
OVstack.create_Stack(); //创建操作数栈
OPstack.create_Stack(); //创建运算符栈
OPstack.enter_Stack('\0'); //首先在运算符栈压入结束符号.
char s[20],c;
int i = 0,flag = 1;
double a,b; //
gets(s); //输入待运算的字符.
while(flag)
{
//如果输入的是数字字符或小数点,转化为数字,入操作数栈
if(s[i]>='0'&& s[i]<='9'||s[i]=='.')
OVstack.enter_Stack(convert(s,i));
//如果当前字符为"("或者优先级别大于运算符栈顶元素的优先级别 ,
else if(s[i]=='('||priority(s[i])>priority(OPstack.read_Top()))
{
OPstack.enter_Stack(s[i]);//当前运算符入栈
i++; //扫描指针进一
}
//如果当前字符为结束符号或者当前运算符的栈顶元素为结束符号,退出循环.
else if(s[i]=='\0'&&OPstack.read_Top()=='\0')
{
flag = 0;
}
//如果当前字符为")",并且当前运算符栈顶元素为"("
else if(s[i]==')'&&OPstack.read_Top()=='(')
{
OPstack.quit_Stack(); //当前运算符出栈;
i++; //扫描指针进一
}
//如果当前字符优先级别小于运算符栈顶元素的优先级别 ,
else if(priority(s[i])<=priority(OPstack.read_Top()))
{
a = OVstack.quit_Stack(); //出栈两个元素
b = OVstack.quit_Stack();
//运算结果重新入操做数栈
switch(OPstack.quit_Stack()) //当前出栈的运算符
{
case '+':OVstack.enter_Stack(a+b);break;
case '-':OVstack.enter_Stack(a-b);break;
case '*':OVstack.enter_Stack(a*b);break;
case '/':OVstack.enter_Stack(a/b);break;
}
}
}
cout << OPstack.read_Top() << endl; //计算结果
OVstack.delete_Stack(); // 释放空间
OPstack.delete_Stack();
system("pause");
return 0;
}
//转化字符为数字
double convert(char *s,int rec)
{
double x = 0.0,y = 1.0;
int flag = 1;
while(s[rec]>='0'&&s[rec]<='9'||s[rec]=='.')
{
if(s[rec]>='0'&&s[rec]<='9')
if(flag) //整数部分
{
x = 10*x+(s[rec]-48);
}
else
{
y = y*0.1,x = x + y*(s[rec]-48); //小数部分 整数部分累加
}
else flag = 0; //flag = 0表示标记小数部分
rec++; //扫描指针进一,直到扫描完当前的一个数.
}
return x;
}
//运算符优先级别
int priority(char c)
{
int k;
//按照优先级别返回
switch(c)
{
case '*':k = 2;break;
case '/':k = 2;break;
case '+':k = 1;break;
case '-':k = 1;break;
case '(':k = 0;break;
case ')':k = 0;break;
case '\0':k = -1;break;
}
return k;
}