c语言用堆栈和队列实现计算器仿真
时间: 2023-08-02 09:27:04 浏览: 118
好的,这是一个经典的问题,我来给你讲讲如何用堆栈和队列实现计算器仿真。
首先,我们需要定义一个结构体来表示计算器的操作数和操作符,可以定义如下:
```c
typedef struct {
int type; // 0表示操作数,1表示操作符
int value; // 操作数的值
char operator; // 操作符
} Element;
```
然后,我们可以定义两个数组来分别表示堆栈和队列,如下:
```c
Element stack[100];
int top = -1;
Element queue[100];
int front = 0, rear = 0;
```
接下来,我们需要实现入栈、出栈、入队、出队等基本操作。具体代码如下:
```c
// 入栈
void push(Element e) {
top++;
stack[top] = e;
}
// 出栈
Element pop() {
if (top == -1) {
printf("Stack is empty!\n");
exit(0);
}
Element e = stack[top];
top--;
return e;
}
// 入队
void enqueue(Element e) {
queue[rear] = e;
rear++;
}
// 出队
Element dequeue() {
if (front == rear) {
printf("Queue is empty!\n");
exit(0);
}
Element e = queue[front];
front++;
return e;
}
```
接下来,我们可以实现一个函数来读取用户输入的表达式并将其转换成操作数和操作符的序列。具体代码如下:
```c
void readExpression() {
char input[100];
printf("Please enter an expression:\n");
scanf("%s", input);
int i = 0;
while (input[i] != '\0') {
if (isdigit(input[i])) { // 如果是数字,将其转换成操作数
int value = input[i] - '0';
i++;
while (isdigit(input[i])) {
value = value * 10 + input[i] - '0';
i++;
}
Element e;
e.type = 0; // 0表示操作数
e.value = value;
enqueue(e);
} else if (input[i] == '+' || input[i] == '-' || input[i] == '*' || input[i] == '/') { // 如果是操作符,直接入队
Element e;
e.type = 1; // 1表示操作符
e.operator = input[i];
enqueue(e);
i++;
} else { // 如果是其它字符,忽略
i++;
}
}
}
```
最后,我们可以实现一个函数来计算表达式的值,具体代码如下:
```c
int calculate() {
while (front < rear) {
Element e = dequeue();
if (e.type == 0) { // 如果是操作数,入栈
push(e);
} else { // 如果是操作符,从栈中取出两个操作数进行计算,将结果入栈
Element e1 = pop();
Element e2 = pop();
int value;
switch (e.operator) {
case '+':
value = e2.value + e1.value;
break;
case '-':
value = e2.value - e1.value;
break;
case '*':
value = e2.value * e1.value;
break;
case '/':
value = e2.value / e1.value;
break;
default:
printf("Invalid operator!\n");
exit(0);
}
Element e3;
e3.type = 0;
e3.value = value;
push(e3);
}
}
Element e = pop();
if (top != -1) {
printf("Invalid expression!\n");
exit(0);
}
return e.value;
}
```
到这里,我们就完成了用堆栈和队列实现计算器仿真的代码。你可以尝试输入一些表达式进行测试。
阅读全文