数据结构计算器实现 c
时间: 2023-05-18 17:00:49 浏览: 158
数据结构计算器实现c需要注意以下几点:
1. 选择数据结构:计算器需要用到栈来实现表达式求值的过程。栈的存储可以使用数组或链表实现。
2. 表达式读取:读取表达式字符串并进行分析,将其中的数字和运算符提取出来放入栈中。
3. 中缀表达式转换:将中缀表达式转换为后缀表达式,方便计算器进行求值。可以借助栈来完成中缀表达式转后缀表达式。
4. 表达式求值:读取后缀表达式,进行运算,得出结果。
下面是一个简单的c语言实现:
```
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define STACK_SIZE 100
char stack[STACK_SIZE]; // 栈
int top = 0; // 栈顶指针
void push(char c) // 进栈
{
if (top >= STACK_SIZE) {
printf("Stack Overflow\n");
exit(-1);
}
stack[++top] = c;
}
char pop() // 出栈
{
if (top <= 0) {
printf("Stack Underflow\n");
exit(-1);
}
return stack[top--];
}
int is_operator(char c) // 判断是否为运算符
{
return(c=='+'||c=='-'||c=='*'||c=='/');
}
int operator_priority(char c) // 运算符优先级
{
if(c=='+'||c=='-') return 1;
if(c=='*'||c=='/') return 2;
return 0;
}
double calculate(double a, double b, char operator) // 计算结果
{
switch (operator) {
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
case '/': return a / b;
}
return 0;
}
double evaluate(char *expression) // 表达式求值
{
char postfix[STACK_SIZE];
int postfix_top = 0;
while (*expression) {
if (isdigit(*expression)) {
double number = atof(expression);
while (isdigit(*expression) || *expression == '.') {
postfix[++postfix_top] = *expression;
expression++;
}
postfix[++postfix_top] = ' ';
} else if (is_operator(*expression)) {
while (top > 0 && is_operator(stack[top]) && operator_priority(stack[top]) >= operator_priority(*expression)) {
postfix[++postfix_top] = pop();
postfix[++postfix_top] = ' ';
}
push(*expression);
expression++;
} else {
expression++;
}
}
while (top > 0) {
postfix[++postfix_top] = pop();
postfix[++postfix_top] = ' ';
}
double result=0, a, b;
while(postfix_top > 0) {
while (postfix[postfix_top] == ' ') postfix_top--;
if (isdigit(postfix[postfix_top])) {
char number_str[100];
int i = 0;
while (isdigit(postfix[postfix_top]) || postfix[postfix_top] == '.') {
number_str[i++] = postfix[postfix_top];
postfix_top--;
}
number_str[i] = '\0';
double number = atof(strrev(number_str));
push(number);
} else if (is_operator(postfix[postfix_top])) {
b = pop();
a = pop();
result = calculate(a, b, postfix[postfix_top]);
push(result);
}
}
return pop();
}
int main()
{
char expression[] = "(2 + 3) * 4 + 5 / 2";
double result = evaluate(expression);
printf("%s = %f\n", expression, result);
return 0;
}
```
阅读全文