用C语言利用栈来完成下列表达式的求值: 3+3*(9-2*3)/3*(8-2*4)-9 要求:给出栈中数据的完整变化过程
时间: 2024-06-03 10:08:09 浏览: 84
首先将表达式转换成逆波兰式: 3 9 2 3 * - * 3 8 2 4 * - * 9 -
变化过程如下:
读入3,将其压入栈中,栈中元素为3
读入9,将其压入栈中,栈中元素为3 9
读入2,将其压入栈中,栈中元素为3 9 2
读入3,将其压入栈中,栈中元素为3 9 2 3
读入*,弹出栈顶两个元素3和3,计算3*3=9,将其压入栈中,栈中元素为9 9 2
读入-,弹出栈顶两个元素9和2,计算9-2=7,将其压入栈中,栈中元素为7 9
读入*,弹出栈顶两个元素7和9,计算7*9=63,将其压入栈中,栈中元素为63
读入3,将其压入栈中,栈中元素为63 3
读入*,弹出栈顶两个元素63和3,计算63*3=189,将其压入栈中,栈中元素为189
读入8,将其压入栈中,栈中元素为189 8
读入2,将其压入栈中,栈中元素为189 8 2
读入4,将其压入栈中,栈中元素为189 8 2 4
读入*,弹出栈顶两个元素2和4,计算2*4=8,将其压入栈中,栈中元素为189 8 8
读入-,弹出栈顶两个元素8和8,计算8-8=0,将其压入栈中,栈中元素为189 0
读入*,弹出栈顶两个元素189和0,计算189*0=0,将其压入栈中,栈中元素为0
读入9,将其压入栈中,栈中元素为0 9
读入-,弹出栈顶两个元素9和0,计算9-0=9,将其压入栈中,栈中元素为9
最终,栈中只剩下一个元素9,即为表达式的值。
相关问题
C语言实现利用栈来完成下列表达式的求值: 3+3*(9-2*3)/3*(8-2*4)-9 要求:给出栈中数据的完整变化过程
栈中数据变化过程如下:
1. 将3入栈
栈:3
2. 将3入栈
栈:3 3
3. 将9入栈
栈:3 3 9
4. 将2入栈
栈:3 3 9 2
5. 将3乘2再减去结果,即计算9-2*3=3,将3入栈
栈:3 3 3
6. 将3出栈
栈:3 3
7. 将3乘3,即计算3*3=9,将9入栈
栈:3 9
8. 将8入栈
栈:3 9 8
9. 将2入栈
栈:3 9 8 2
10. 将4乘2再减去结果,即计算8-2*4=0,将0入栈
栈:3 9 0
11. 将3出栈,将0出栈
栈:3 9
12. 将9乘3,即计算9*3=27,将27入栈
栈:3 27
13. 将3出栈
栈:27
14. 将27出栈
栈:空
15. 将-9入栈
栈:-9
最终结果为-9。
用C语言写出下列代码,设表达式中允许包含3种括号:圆括号、方括号和大括号。即小括号、中括号和大括号。 编写一个算法来判断表达式中的括号是否正确配对,要求利用栈的结构实现。 输入格式: 输入一行带圆括号、方括号和大括号的字符串。 输出格式: 若匹配,输出yes。若不匹配,输出no。。 输入样例: 在这里给出一组输入。例如: ([1+2]) 输出样例: 在这里给出相应的输出。例如: yes 输入样例: 在这里给出一组输入。例如: ([ 输出样例: 在这里给出相应的输出。例如: no
以下是C语言实现该算法的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char *data;
int top;
int size;
} Stack;
void init(Stack *s) {
s->data = (char *) malloc(sizeof(char));
s->top = -1;
s->size = 1;
}
void push(Stack *s, char c) {
if (s->top == s->size - 1) {
s->data = (char *) realloc(s->data, 2 * s->size * sizeof(char));
s->size *= 2;
}
s->data[++s->top] = c;
}
char pop(Stack *s) {
return s->data[s->top--];
}
int is_empty(Stack *s) {
return s->top == -1;
}
void clear(Stack *s) {
free(s->data);
s->top = -1;
s->size = 1;
}
int check_brackets(char *s) {
Stack stack;
init(&stack);
for (int i = 0; s[i] != '\0'; i++) {
if (s[i] == '(' || s[i] == '[' || s[i] == '{') {
push(&stack, s[i]);
} else if (s[i] == ')' || s[i] == ']' || s[i] == '}') {
if (is_empty(&stack)) {
clear(&stack);
return 0;
}
char c = pop(&stack);
if ((c == '(' && s[i] != ')') || (c == '[' && s[i] != ']') || (c == '{' && s[i] != '}')) {
clear(&stack);
return 0;
}
}
}
int result = is_empty(&stack);
clear(&stack);
return result;
}
int main() {
char s[1000];
scanf("%s", s);
if (check_brackets(s)) {
printf("yes\n");
} else {
printf("no\n");
}
return 0;
}
```
该算法的思路与Python实现相同,使用栈来存储左括号,遇到右括号时弹出栈顶元素,如果能配对则继续遍历,否则返回0。如果遍历完字符串后栈为空,则说明所有括号都配对成功,返回1;否则返回0。
阅读全文