如何用C语言栈进行计算
使用C语言栈进行计算,主要包括栈的基本操作、表达式的转换、表达式的计算。我们可以通过栈来实现中缀表达式到后缀表达式的转换,再通过栈来计算后缀表达式的值。栈的基本操作包括入栈、出栈、获取栈顶元素等,使用栈可以有效处理表达式中的运算符优先级和括号等问题。下面我们详细展开其中的栈的基本操作及其在计算中的应用。
一、栈的基本操作
1. 栈的定义及初始化
在C语言中,栈通常用结构体数组来实现。首先,我们需要定义一个栈结构体,并提供初始化函数。
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef struct {
int data[MAXSIZE];
int top;
} Stack;
void initStack(Stack *s) {
s->top = -1;
}
2. 入栈操作
入栈操作是将元素添加到栈顶。如果栈未满,我们将元素放入栈顶并更新栈顶指针。
int push(Stack *s, int value) {
if (s->top == MAXSIZE - 1) {
printf("Stack Overflown");
return -1;
}
s->data[++(s->top)] = value;
return 0;
}
3. 出栈操作
出栈操作是从栈顶移除元素。如果栈不为空,我们获取栈顶元素,并将栈顶指针下移。
int pop(Stack *s, int *value) {
if (s->top == -1) {
printf("Stack Underflown");
return -1;
}
*value = s->data[(s->top)--];
return 0;
}
4. 获取栈顶元素
获取栈顶元素但不移除它,用于查看当前栈顶的值。
int peek(Stack *s, int *value) {
if (s->top == -1) {
printf("Stack is emptyn");
return -1;
}
*value = s->data[s->top];
return 0;
}
二、表达式的转换
1. 中缀表达式转后缀表达式
中缀表达式是我们通常使用的表达式形式,如3 + 4 * (2 - 1)
。为了方便计算,需要将中缀表达式转换为后缀表达式(逆波兰表达式),如3 4 2 1 - * +
。
#include <ctype.h>
#include <string.h>
int precedence(char op) {
switch (op) {
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
case '(':
return 0;
}
return -1;
}
void infixToPostfix(char *infix, char *postfix) {
Stack s;
initStack(&s);
int i, j = 0;
char ch, temp;
for (i = 0; infix[i] != '