数据结构实验计算表达式
做了一天的数据结构实验——能够进行算术表达式的计算
根据书上的思路,书上只能够处理后缀表达式,但题目要求是输入的是中缀表达式,因此需要进行转化
中缀表达式转后缀表达式的思路
1、先读入输入的数据,用getline(cin,s)的方式;
2、搞一个中间栈,用于存放遍历数组时遇到的符号,方便后续能够将符号弹出到后续表达式上;
3、注意提取数字、运算符号的方式;
一些小知识点
1、可以通过控制数据输入流的方式,对流入的数据进行处理,从而可以将输入的算术表达式中的数字提取为double型数据
while (infile >> ch, ch != '#') {
switch (ch) {
case '+':case '-':case '*':case '/':
DoOperator(ch);
break;
default:infile.putback(ch); // 这里的putback是真让我大开眼界
infile >> newOperand;
AddOperand(newOperand);
}
}2、string类型数据怎么能作为需要char星类型函数的参数,方法是直接将string类型数据的首地址作为那一个char星类型的参数
int getop(char* src, int start, int& nextstart, char* token) {
int i, j;
if (IsNumber(src[start])) {
for (i = 0; IsNumber(src[start + i]) || src[start + i] == '.'; i++) {
token[i] = src[start + i]; // 其实token就是用来提取表达式中的值的
}
token[i] = 0; // 注意,此处的0并非是字符的‘0’,而是数字0,因此可以用来作为for循环的终止判断条件
nextstart = start + i; // 下一次用于提取表达式中的数字
return 1;
}
else if ((src[start] == '+' || src[start] == '-') && (start == 0 || src[start - 1] == '(')) {
// 确保存进来的这一位是一个带符号数,后面的判断条件就是限制其满足符号数的规则
if (src[start] == '-') {
token[0] = src[start];
j = 1; // 如果是负号的话,就把负号给token[0],然后j=1就是从第二位开始把负号输进去
}
else {
// 去掉正号的情况
j = 0;
}
for (i = 1; IsNumber(src[start + i]) || src[start + i] == '.'; i++) {
// 将后面的数值添加到token里面
token[j++] = src[start + i];
}
token[j] = 0; // 可以简单的理解为以0作为token的一个分割符,事实上也可以用‘ ’开作为其分隔符的
nextstart = start + i;// 下一次提取的开端
return 1;
}
else {
token[0] = src[start]; // 从输入流中将该符号进行提取
token[1] = 0;
nextstart = start + 1;// 下一次提取的开端
}
return 0; // 不是数据
}
string zhong;
char hou[100]="";
//char zhong[100]="",hou[100] = "";
//cout << "请输入一句中缀表达式:" << endl;
//getline(cin, zhong);
zhong = gouZhao;
//cin.getline(zhong,100);
// 进行中缀转后缀
Zhong2Hou(&zhong[0], hou);
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Charl!