本篇文章重点为大家分享一下C++中缀表达式转后缀表达式具体实现方法,有需要的小伙伴可以参考一下。
成都创新互联公司是一家集网站建设,沁阳企业网站建设,沁阳品牌网站建设,网站定制,沁阳网站建设报价,网络营销,网络优化,沁阳网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。
1.用字符数组存储整行输入的中缀表达式;
2.接着从字符数组的0位置开始判断字符,如果是数字,那就要判断后面是否是数字,如果是就不断扫描组成一个整数
(暂不考虑负数和小数),最终组成一个整数,然后输出这个数(因为不用计算,所以直接输出即可);
3.如果是左括号,直接进符号栈;
4.如果是操作运算符,与符号栈的栈顶元素比较优先级:如果高就压入栈;
低,就取出符号栈顶的元素输出;
接着,再判断符号栈顶的元素和当前的运算符号继续比较优先级,重复前面步骤,直到栈空或者当前的符号优先级高;
5.如果是右括号,把符号栈栈顶的元素取出,如果不是左括号,把取出的运算符输出,接着取符号栈栈顶的元素,直到符号栈中取出的符号是左括号;
6.当扫描完字符数组时,判断符号栈是否为空:
不为空,把符号栈栈顶的元素取出,输出到窗口,直到符号栈为空。
// 中缀表达式转后缀表达式
// 操作符:+、-、*、/、%
// 输入:可以用cin.getline(arr, 250)或者cin.get(ch) && ch != '\n'
// 测试数据:输入格式:(注意:不能有中文的操作符)
// 2+(3+4)*5
// 16+2*30/4
// 输出格式:
// 2 3 4 + 5 * +
// 16 2 30 * 4 / +
#include
#include
// 判断是否是操作符
bool isOperator(char ch) {
if(ch == '+' || ch == '-' || ch == '*' || ch == '/')
return true;
return false; // 否则返回false
}
// 获取优先级
int getPriority(char ch) {
int level = 0; // 优先级
switch(ch) {
case '(':
level = 1;
break;
case '+':
case '-':
level = 2;
break;
case '*':
case '/':
level = 3;
break;
default:
break;
}
return level;
}
int main(int argc, const char * argv[]) {
// insert code here...
int num;
char arr[250]; // 一个一个的读取表达式,直到遇到'\0'
std::stack op; // 栈op:存储操作符
while(1) {
std::cin.getline(arr,250);
int len, i;
char c; // c存储从栈中取出的操作符
len = (int)strlen(arr); // strlen()输出的是:unsigned long类型,所以要强制转换为int类型
i = 0;
while(i if(isdigit(arr[i])) { // 如果是数字
num = 0;
do {
num = num * 10 + (arr[i] - '0'); // ch - 48根据ASCAII码,字符与数字之间的转换关系
i++; // 下一个字符
}while(isdigit(arr[i]));
std::cout " ";
} else if(arr[i] == '(') { // (:左括号
op.push(arr[i]);
i++;
} else if(isOperator(arr[i])) { // 操作符
if(op.empty()) {// 如果栈空,直接压入栈
op.push(arr[i]);
i++;
}
else {
// 比较栈op顶的操作符与ch的优先级
// 如果ch的优先级高,则直接压入栈
// 否则,推出栈中的操作符,直到操作符小于ch的优先级,或者遇到(,或者栈已空
while(!op.empty()) {
c = op.top();
if(getPriority(arr[i]) " ";
op.pop();
} else // ch优先级高于栈中操作符
break;
} // while结束
op.push(arr[i]); // 防止不断的推出操作符,最后空栈了;或者ch优先级高了
i++;
} // else
} else if(arr[i] == ')') { // 如果是右括号,一直推出栈中操作符,直到遇到左括号(
while(op.top() != '(') {
std::cout " ";
op.pop();
}
op.pop(); // 把左括号(推出栈
i++;
} else // 如果是空白符,就进行下一个字符的处理
i++;
} // 第二个while结束
while(!op.empty()) { // 当栈不空,继续输出操作符
std::cout " ";
op.pop();
}
std::cout while结束
return 0;
}
运行结果:
当前文章:C++中缀表达式转后缀表达式具体实现方法
网页网址:http://www.stwzsj.com/qtweb/news34/14434.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联