c语言 中缀表达式转后缀表达式,C++实现中缀表达式转后缀表达式

本文实例为大家分享了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 < len) {

if(isdigit(arr[i])) { // 如果是数字

num = 0;

do {

num = num * 10 + (arr[i] - '0'); // ch - 48根据ASCAII码,字符与数字之间的转换关系

i++; // 下一个字符

}while(isdigit(arr[i]));

std::cout << num << " ";

} 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]) <= getPriority(c)) {

// 优先级低或等于

std::cout << c << " ";

op.pop();

} else // ch优先级高于栈中操作符

break;

} // while结束

op.push(arr[i]); // 防止不断的推出操作符,最后空栈了;或者ch优先级高了

i++;

} // else

} else if(arr[i] == ')') { // 如果是右括号,一直推出栈中操作符,直到遇到左括号(

while(op.top() != '(') {

std::cout << op.top() << " ";

op.pop();

}

op.pop(); // 把左括号(推出栈

i++;

} else // 如果是空白符,就进行下一个字符的处理

i++;

} // 第二个while结束

while(!op.empty()) { // 当栈不空,继续输出操作符

std::cout << op.top() << " ";

op.pop();

}

std::cout << std::endl;

flush(std::cout);

} // 第一个while结束

return 0;

}

运行结果:

b33c4b1e0a79f75b3a7de8151a81c946.png

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为了让这个任务变得更具有挑战性,我将不会使用任何eval()函数来计算后缀表达式。而是手写一个算法,利用栈来计算后缀表达式。 具体思路如下: 1. 遍历中缀表达式的每一个字符。 2. 如果字符是一个数字,直接将其添加到后缀表达式。 3. 如果字符是一个运算符,则将其加入到操作符栈。 4. 如果字符是一个左括号,则将其加入到操作符栈。 5. 如果字符是一个右括号,则将操作符栈的所有操作符弹出并添加到后缀表达式,直到找到左括号。将左括号从操作符栈弹出。 6. 如果操作符栈内部有高优先级(乘除优先于加减)的操作符,将它们弹出并添加到后缀表达式。 7. 重复1-6,直到处理完所有字符。 8. 将后缀表达式的每一个字符依次弹出,如果是数字则加入到数字栈,如果是操作符,则从数字栈弹出两个数字进行计算,并将计算结果加入到数字栈。最终数字栈的唯一元素即为后缀表达式所代表的计算结果。 下面是c语言代码实现: ```c #include <stdio.h> #include <stdlib.h> #include <ctype.h> //isdigit函数头文件 #include <string.h> //strlen函数头文件 #define STACK_SIZE 100 //栈大小定义 char infix_exp[STACK_SIZE]; //中缀表达式字符串定义 char postfix_exp[STACK_SIZE]; //后缀表达式字符串定义 typedef struct { char items[STACK_SIZE]; int top; } Stack; Stack operator_stack = { .top = -1 }; //运算符栈定义 Stack value_stack = { .top = -1 }; //操作数栈定义 void push(Stack *s, char c) { if (s->top >= STACK_SIZE - 1) { printf("Stack overflow.\n"); exit(EXIT_FAILURE); } s->items[++(s->top)] = c; } char pop(Stack *s) { if (s->top <= -1) { printf("Stack Underflow.\n"); exit(EXIT_FAILURE); } return s->items[(s->top)--]; } char peek(Stack *s) { return s->items[s->top]; } int is_empty(Stack *s) { return (s->top <= -1); } int priority(char op) { switch (op) { case '+': case '-': return 1; case '*': case '/': return 2; default: return 0; } } void infix_to_postfix() { int i; int k = 0; //后缀表达式字符串下标 for (i = 0; infix_exp[i] != '\0'; i++) { if (isdigit(infix_exp[i])) //是数字,直接添加到后缀表达式 { postfix_exp[k++] = infix_exp[i]; } else if (infix_exp[i] == '(') //左括号,直接入栈 { push(&operator_stack, infix_exp[i]); } else if (infix_exp[i] == ')') //右括号,一直出栈直到找到左括号 { while (!is_empty(&operator_stack) && peek(&operator_stack) != '(') { postfix_exp[k++] = pop(&operator_stack); } pop(&operator_stack); //将左括号弹出 } else //操作符 { while (!is_empty(&operator_stack) && priority(infix_exp[i]) <= priority(peek(&operator_stack))) { postfix_exp[k++] = pop(&operator_stack); } push(&operator_stack, infix_exp[i]); } } while (!is_empty(&operator_stack)) { postfix_exp[k++] = pop(&operator_stack); } postfix_exp[k] = '\0'; } void evaluate_postfix() { int i, a, b; int len = strlen(postfix_exp); for (i = 0; i < len; i++) { if (isdigit(postfix_exp[i])) { push(&value_stack, postfix_exp[i] - '0'); //将字符转换成数字再添加到操作数栈 } else //遇到操作符,从操作数栈弹出两个数进行计算 { a = pop(&value_stack); b = pop(&value_stack); switch (postfix_exp[i]) { case '+': push(&value_stack, b + a); //注意操作数入栈顺序 break; case '-': push(&value_stack, b - a); break; case '*': push(&value_stack, b * a); break; case '/': push(&value_stack, b / a); break; } } } printf("The result is: %d\n", peek(&value_stack)); } int main() { printf("Please enter an infix expression: "); fgets(infix_exp, STACK_SIZE, stdin); infix_to_postfix(); printf("The postfix expression is: %s\n", postfix_exp); evaluate_postfix(); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值