数据结构学习之栈的应用:逆波兰表示法

栈的应用:逆波兰表示法

后缀表示法
(1+2)*(3-4)
12+34-*

 

中缀表示法:(1+2) * (3-4)

后缀表示法 :12+34-*

中缀表示法:比较复杂适合人看

后缀表示法:适合计算机做 计算机适合做固定的套路

利用栈把中缀表示法转换成后缀表示

思路:

1遇到数字进行入栈

2遇到操作符进行连续两个出栈操作

//@遇到数字进行入栈
//@遇到操作符进行连续两个出栈操作
中缀表示转后缀表示:
   

例题:
5*(((9+8)*(4*6))+7)//中缀表示法 转后缀表示法
步骤:
5(((9+8)*(4*6))+7)*
5((9+8)*(4*6))7+*
5(9+8)(4*6)*7+*
598+46**7+*

数栈的应用:逆波兰表示法

//数据结构:栈的应用:逆波兰表示法
//例题 (1+2)*(3-4)->12+34-*
//本例程只能实现输入0~9的数字 进行处理
#include<stdio.h>
#include<string.h>
int stack[512];//存放栈的数据
int top = 0; //指向栈顶的指针

void push(int c);
int pop(void);
int is_empty(void);

int main(void) {

char a[100]; //存放输入的数据
int n; //存放输入数据的长度
int n1, n2; //存放取出的数据
printf("请输入数据:\n");
gets(a); //获取输入的字符 放入数组a中
n = strlen(a); //获取输入的字符长度
for (int i = 0; i < n; i++) {
if (a[i] >= '0' && a[i] <=  '9' ) //判断a[i]是否大于0和小于9 即遇到的是操作数还是操作符
push(a[i] - '0'); //取出操作数
else {
n2 = pop(); //取出操作数2
n1 = pop(); //取出操作数1
switch (a[i]) { //检测输入的操作符
case '+': //为+则对数据+操作
push(n1 + n2);
break;
case '-':
push(n1 - n2);
break;

case '*':
push(n1 * n2);
break;
}
}

}
printf("result=%d", pop());//将计算出的结果打印出来
return 0;
}

//入栈操作
void push(int c) {
stack[top++] = c;
}

//出栈操作
int pop(void) {
return stack[--top];
}

//检测栈是否为空
int is_empty(void) {
return top == 0;
}
 

 

posted @ 2022-04-23 11:48  2022/3/19/312/7-4  阅读(73)  评论(0)    收藏  举报