idk why these stuffs get stashed for so long and I didn't ever commit them
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
#include<iostream> //cout,cin
|
||||
using namespace std;
|
||||
#include"SqStack.h"
|
||||
#include<stdlib.h> // atoi()
|
||||
|
||||
char pause;
|
||||
|
||||
@@ -51,9 +52,9 @@ char Precede(char t1,char t2) //
|
||||
}
|
||||
|
||||
|
||||
bool In(char ch) // 判断 ch 是否为运算符
|
||||
bool In(char c) // 判断 c 是否为运算符
|
||||
{
|
||||
switch(ch)
|
||||
switch(c)
|
||||
{
|
||||
case'+':
|
||||
case'-':
|
||||
@@ -69,21 +70,21 @@ bool In(char ch) //
|
||||
|
||||
float Operate(float a,char theta,float b)
|
||||
{ // 实施一次运算
|
||||
float ch;
|
||||
float c;
|
||||
switch(theta)
|
||||
{
|
||||
case'+':ch=a+b;
|
||||
case'+':c=a+b;
|
||||
break;
|
||||
case'-':ch=a-b;
|
||||
case'-':c=a-b;
|
||||
break;
|
||||
case'*':ch=a*b;
|
||||
case'*':c=a*b;
|
||||
break;
|
||||
case'/':ch=a/b;
|
||||
case'/':c=a/b;
|
||||
}
|
||||
return ch;
|
||||
return c;
|
||||
}
|
||||
|
||||
//算法3.12
|
||||
|
||||
float Val_Exp(char *exp) // 中缀表达式求值。
|
||||
{
|
||||
SqStack<char> OP; // 运算符栈
|
||||
@@ -91,82 +92,82 @@ float Val_Exp(char *exp) //
|
||||
InitStack(OP,30);
|
||||
InitStack(OD,30);
|
||||
char theta;
|
||||
float a,b,result;
|
||||
char ch,x; // 存放由键盘接收的字符
|
||||
float a,b,d;
|
||||
char c,x; // 存放由键盘接收的字符
|
||||
char z[6]; // 存放符点数字符串
|
||||
int i;
|
||||
Push(OP,'='); // # 是表达式结束标志
|
||||
ch=*exp++;
|
||||
c=*exp++;
|
||||
GetTop(OP,x);
|
||||
while(ch!='='||x!='=')
|
||||
while(c!='='||x!='=')
|
||||
{
|
||||
if(ch>='0'&&ch<='9'||ch=='.') // ch 是操作数
|
||||
if(c>='0'&&c<='9'||c=='.') // c 是操作数
|
||||
{
|
||||
i=0;
|
||||
do
|
||||
{
|
||||
z[i]=ch;
|
||||
z[i]=c;
|
||||
i++;
|
||||
ch=*exp++;
|
||||
} while(ch>='0'&&ch<='9'||ch=='.');
|
||||
c=*exp++;
|
||||
} while(c>='0'&&c<='9'||c=='.');
|
||||
z[i]='\0';
|
||||
result=atof(z); // 将字符串数组转为符点型存于result
|
||||
Push(OD,result);
|
||||
d=atof(z); // 将字符串数组转为符点型存于d
|
||||
Push(OD,d);
|
||||
}
|
||||
else if(In(ch)) // 是7种运算符之一
|
||||
switch(Precede(x,ch))
|
||||
else if(In(c)) // 是7种运算符之一
|
||||
switch(Precede(x,c))
|
||||
{
|
||||
case'<':Push(OP,ch); // 栈顶元素优先权低
|
||||
ch=*exp++;
|
||||
case'<':Push(OP,c); // 栈顶元素优先权低
|
||||
c=*exp++;
|
||||
break;
|
||||
case'=':Pop(OP,x); // 脱括号并接收下一字符
|
||||
ch=*exp++;
|
||||
c=*exp++;
|
||||
break;
|
||||
case'>':Pop(OP,theta); // 退栈并将运算结果入栈
|
||||
Pop(OD,b);
|
||||
Pop(OD,a);
|
||||
Push(OD,Operate(a,theta,b));
|
||||
}
|
||||
else // ch是非法字符
|
||||
else // c是非法字符
|
||||
{
|
||||
cout<<"ERROR3"<<endl;;
|
||||
exit(0);
|
||||
}
|
||||
GetTop(OP,x);
|
||||
}
|
||||
GetTop(OD,result);
|
||||
GetTop(OD,d);
|
||||
DestroyStack(OP);
|
||||
DestroyStack(OD);
|
||||
return result;
|
||||
return d;
|
||||
}
|
||||
|
||||
void CreatePostExp(char * exp,char * &postexp) // 由中缀式求后缀式
|
||||
{
|
||||
char ch,x;
|
||||
char c,x;
|
||||
int i=0;
|
||||
SqStack<char> OP;
|
||||
InitStack(OP,30);
|
||||
Push(OP,'='); // # 是表达式结束标志
|
||||
cout<<"中缀表达式:"<<exp<<endl;
|
||||
ch=*exp++;
|
||||
while(ch)
|
||||
c=*exp++;
|
||||
while(c)
|
||||
{
|
||||
if((ch>='0'&&ch<='9')||ch=='.')
|
||||
if((c>='0'&&c<='9')||c=='.')
|
||||
{
|
||||
postexp[i++]=ch;
|
||||
ch=*exp++;
|
||||
postexp[i++]=c;
|
||||
c=*exp++;
|
||||
}
|
||||
if(In(ch)) // 是7种运算符之一
|
||||
if(In(c)) // 是7种运算符之一
|
||||
{
|
||||
postexp[i++]=' ';
|
||||
GetTop(OP,x);
|
||||
switch(Precede(x,ch))
|
||||
switch(Precede(x,c))
|
||||
{
|
||||
case'<':Push(OP,ch); // 栈顶元素优先权低
|
||||
ch=*exp++;
|
||||
case'<':Push(OP,c); // 栈顶元素优先权低
|
||||
c=*exp++;
|
||||
break;
|
||||
case'=':Pop(OP,x); // 脱括号并接收下一字符
|
||||
ch=*exp++;
|
||||
c=*exp++;
|
||||
break;
|
||||
case'>':
|
||||
Pop(OP,postexp[i++]); // 运算符出栈输出
|
||||
@@ -179,43 +180,42 @@ void CreatePostExp(char * exp,char * &postexp) //
|
||||
DestroyStack(OP);
|
||||
}
|
||||
|
||||
//算法3.13
|
||||
float Val_PostExp(char *postexp) // 后缀表达式求值
|
||||
{
|
||||
int i;
|
||||
char z[6];
|
||||
float result=0,d=0,a,b;
|
||||
char ch;
|
||||
float v=0,d=0,a,b;
|
||||
char c;
|
||||
SqStack<float> OD;
|
||||
InitStack(OD,30);
|
||||
ch=*postexp++;
|
||||
while(ch!='\0')
|
||||
c=*postexp++;
|
||||
while(c!='\0')
|
||||
{
|
||||
|
||||
if(ch>='0'&&ch<='9'||ch=='.') // ch为操作数符号
|
||||
if(c>='0'&&c<='9'||c=='.') // c为操作数符号
|
||||
{
|
||||
i=0;
|
||||
do
|
||||
{
|
||||
z[i++]=ch;
|
||||
ch=*postexp++; // 取下一个操作数符号
|
||||
} while(ch>='0'&&ch<='9'||ch=='.');
|
||||
z[i++]=c;
|
||||
c=*postexp++; // 取下一个操作数符号
|
||||
} while(c>='0'&&c<='9'||c=='.');
|
||||
z[i]='\0';
|
||||
d=atof(z); // 将字符串数组转为符点型存于result
|
||||
d=atof(z); // 将字符串数组转为符点型存于d
|
||||
Push(OD,d); // 操作数进栈
|
||||
}
|
||||
if(In(ch)) // ch为运算符
|
||||
if(In(c)) // c为运算符
|
||||
{
|
||||
Pop (OD,a);
|
||||
Pop (OD,b);
|
||||
Push (OD,Operate(b,ch,a));
|
||||
ch=*postexp++;
|
||||
Pop (OD,a);
|
||||
Push (OD,Operate(a,c,b));
|
||||
c=*postexp++;
|
||||
}
|
||||
ch=*postexp++;
|
||||
c=*postexp++;
|
||||
}
|
||||
Pop (OD,result);
|
||||
DestroyStack(OD);
|
||||
return result;
|
||||
Pop (OD,v);
|
||||
//DestoryStack(OD);
|
||||
return v;
|
||||
}
|
||||
|
||||
|
||||
@@ -224,6 +224,7 @@ void main()
|
||||
{
|
||||
//int i;
|
||||
char exp[20]="(2.2+5)+4*(5-3.1)=";
|
||||
|
||||
char *postexp;
|
||||
postexp=new char[30];
|
||||
*postexp='\0';
|
||||
@@ -275,7 +276,7 @@ void main()
|
||||
cout<<"\n结束运行,Bye-Bye!"<<endl;
|
||||
break;
|
||||
default://
|
||||
cout<<"\n无效选择!\n";
|
||||
cout<<"\nInvalid choice\n";
|
||||
break;
|
||||
}
|
||||
}while(choice!=0);
|
||||
|
||||
Reference in New Issue
Block a user