资源简介
使用栈将中缀表达式转化为后缀表达式然后求值
语言C++
代码片段和文件信息
#include
#include
#include
//*******************************************************************************************************
class Stack{ //栈类定义
private:
double A[300];
public:
void InitStack() //初始化
{ A[0] = 0;}
void Push(double key) //入栈
{
if(A[0]<= 300 - 1)
{
int i = (int)++A[0];
A[i] = key;
}
else
printf(“栈已满!!\n“);
}
double Pop() //出栈
{
if(A[0] != 0)
{
int i = (int)A[0];
A[0]--;
return A[i];
}
printf(“栈已空!!\n“);
return -1;
}
bool IsOneLeft()
{
if((int)A[0] == 1)
return 1;
return 0;
}
};
//**********************************************************************************************************************
char* SExp(char s[]) //求后缀表达式
{
int iabc=0;
char A[300]B[300];
i = 0;
a = 0;
while(s[i] != ‘\0‘) //首次遍历,检查是否有输入错误以及整理表达式
{
if(s[i] <= ‘9‘ && s[i] >=‘0‘) A[a++] = s[i]; //数字
else if(s[i] == ‘-‘) //减法
{
if(i==0||s[i-1]==‘(‘)
{
A[a++] = ‘~‘;
}
else if(s[i+1]!=‘+‘&&s[i+1]!=‘^‘&&s[i+1]!=‘/‘&&s[i+1]!=‘*‘&&s[i+1]!=‘-‘&&s[i+1]!=‘)‘)
A[a++] = s[i];
else c=1;
}
else if(s[i] == ‘+‘) //加法
{
if(i==0||s[i-1]==‘(‘)
{}
else if(s[i+1]!=‘+‘&&s[i+1]!=‘^‘&&s[i+1]!=‘/‘&&s[i+1]!=‘*‘&&s[i+1]!=‘-‘&&s[i+1]!=‘)‘)
A[a++] = s[i];
else c=1;
}
else if(s[i]==‘*‘) //乘法
{
if(s[i+1]!=‘+‘&&s[i+1]!=‘^‘&&s[i+1]!=‘/‘&&s[i+1]!=‘*‘&&s[i+1]!=‘-‘&&s[i-1]!=‘(‘&&s[i+1]!=‘)‘&&i!=0) A[a++] = s[i];
else c=1;
}
else if(s[i]==‘/‘) //除法
{
if(s[i+1]!=‘+‘&&s[i+1]!=‘^‘&&s[i+1]!=‘/‘&&s[i+1]!=‘*‘&&s[i+1]!=‘-‘&&s[i-1]!=‘(‘&&s[i+1]!=‘)‘&&i!=0) A[a++] = s[i];
else c=1;
}
else if(s[i]==‘^‘) //指数运算
{
if(s[i+1]!=‘+‘&&s[i+1]!=‘^‘&&s[i+1]!=‘/‘&&s[i+1]!=‘*‘&&s[i+1]!=‘-‘&&s[i-1]!=‘(‘&&s[i+1]!=‘)‘&&i!=0) A[a++] = s[i];
else c=1;
}
else if(s[i]==‘)‘&&s[i-1]!=‘+‘&&s[i-1]!=‘^‘&&s[i-1]!=‘/‘&&s[i-1]!=‘*‘&&s[i-1]!=‘-‘&&s[i+1]!=‘(‘&&s[i-1]!=‘(‘&&i!=0) A[a++] = s[i]; //后括号处理
else if(s[i]==‘(‘&&s[i+1]!=‘^‘&&s[i+1]!=‘/‘&&s[i+1]!=‘*‘&&s[i+1]!=‘)‘&&s[i-1]!=‘)‘) A[a++] = s[i]; //前括号处理
else
c=1;
i++;
if(c) //箭头报错设置
{
putchar(24);
printf(“\n箭头处表达式有误!\n“);
return NULL;
}
putchar(‘ ‘);
}
A[a]=‘\0‘;
strcpy(sA);
//printf(“\n%s“s);
i=0;
a=0;
b=0;
while(s[i] != ‘\0‘) //求后缀表达式
{
if(s[i] <= ‘9‘ && s[i] >=‘0‘||s[i]==‘~‘)
{
A[a++]=s[i++];
while(s[i] <= ‘9‘ && s[i] >=‘0‘&&s[i] != ‘\0‘)
{
A[a++]=s[i++];
}
A[a++]=‘ ‘;
continue;
}
else if(s[i]==‘+‘)
{
if(b==0||B[b-1]==‘(‘) B[b++]=‘+‘;
else
{
A[a++]=B[--b];
A[a++]=‘ ‘;
B[b++]=‘+‘;
}
}
else if(s[i]==‘-‘)
{
if(b==0||B[b-1]==‘(‘) B[b++]=‘-‘;
else
{
A[a++]=B[--b];
A[a++]=‘ ‘;
B[b++]=‘-‘;
}
}
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 33792 2010-11-12 13:17 中缀表达式求值\Debug\vc60.idb
文件 53248 2010-11-12 13:17 中缀表达式求值\Debug\vc60.pdb
文件 217144 2010-11-12 13:17 中缀表达式求值\Debug\zxbdsqz.exe
文件 228520 2010-11-12 13:17 中缀表达式求值\Debug\zxbdsqz.ilk
文件 13226 2010-11-12 13:17 中缀表达式求值\Debug\zxbdsqz.obj
文件 217588 2010-11-11 18:29 中缀表达式求值\Debug\zxbdsqz.pch
文件 484352 2010-11-12 13:17 中缀表达式求值\Debug\zxbdsqz.pdb
文件 5257 2010-11-12 13:17 中缀表达式求值\zxbdsqz.cpp
文件 3413 2010-11-11 18:27 中缀表达式求值\zxbdsqz.dsp
文件 522 2010-11-11 18:29 中缀表达式求值\zxbdsqz.dsw
文件 41984 2010-11-12 13:23 中缀表达式求值\zxbdsqz.ncb
文件 48640 2010-11-12 13:23 中缀表达式求值\zxbdsqz.opt
文件 1433 2010-11-12 13:17 中缀表达式求值\zxbdsqz.plg
目录 0 2010-11-12 13:17 中缀表达式求值\Debug
目录 0 2010-11-12 13:23 中缀表达式求值
----------- --------- ---------- ----- ----
1349119 15
评论
共有 条评论