C言語を使用してスタックで式評価を行うには
スタックを使用した式評価の一般的な手法は以下のとおりです。
演算子と被演算子を保存するためのスタックをそれぞれ定義する。
式の各文字を順に走査し、以下の規則に従って処理します。
- オペランドが文字の場合は整数に変換して、オペランドスタックにプッシュする。
- 演算子だった場合は、次のように処理する。演算子スタックが空であるか、また、演算子スタックのスタックトップ演算子が左括弧'(‘の場合、演算子を演算子スタックに格納する。
演算子スタックが空でなく、かつ、スタックトップ演算子の優先度が現在演算子の優先度以上の場合、オペランドスタックから2つのオペランドをポップさせ、演算子スタックから1つの演算子をポップさせ、演算を行い、結果をオペランドスタックに格納する。この手順を、演算子スタックが空になるまで、またはスタックトップ演算子の優先度が現在演算子の優先度未満になるまで繰り返した後に、現在演算子を演算子スタックに格納する。
現在演算子が右括弧’)’の場合、オペランドスタックから2つのオペランドをポップさせ、演算子スタックから1つの演算子をポップさせ、演算を行い、結果をオペランドスタックに格納する。この手順を左括弧'(‘になるまで繰り返した後、左括弧を演算子スタックからポップさせる。
式全体を走査した後、演算子スタックが空でなければ、オペランドスタックからオペランド2つを取り出し、演算子スタックから演算子1つを取り出し、計算して結果をオペランドスタックに積む。これは、演算子スタックが空になるまで続く。
最後に、オペランドスタックに残った唯一の要素は式の最終結果となります。
スタックを使用して式を評価する実装例を以下に示す。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define MAX_SIZE 100
// 定义栈结构
typedef struct {
int data[MAX_SIZE];
int top;
} Stack;
// 初始化栈
void initStack(Stack* s) {
s->top = -1;
}
// 判断栈是否为空
int isEmpty(Stack* s) {
return s->top == -1;
}
// 判断栈是否已满
int isFull(Stack* s) {
return s->top == MAX_SIZE - 1;
}
// 元素入栈
void push(Stack* s, int val) {
if (isFull(s)) {
printf("Stack is full!\n");
return;
}
s->data[++s->top] = val;
}
// 元素出栈
int pop(Stack* s) {
if (isEmpty(s)) {
printf("Stack is empty!\n");
return -1;
}
return s->data[s->top--];
}
// 获取栈顶元素
int top(Stack* s) {
if (isEmpty(s)) {
printf("Stack is empty!\n");
return -1;
}
return s->data[s->top];
}
// 获取操作符的优先级
int getPriority(char op) {
switch (op) {
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
default:
return 0;
}
}
// 执行计算
int calculate(int num1, int num2, char op) {
switch (op) {
case '+':
return num1 + num2;
case '-':
return num1 - num2;
case '*':
return num1 * num2;
case '/':
return num1 / num2;
default:
return 0;
}
}
// 使用栈求解表达式的值
int evaluateExpression(char* expression) {
Stack numStack; // 操作数栈
Stack opStack; // 操作符栈
initStack(&numStack);
initStack(&opStack);
int num = 0; // 用于处理多位数
int sign = 1; // 用于处理负数