以C语言建立顺序栈,实现入栈、出栈、获取栈顶元素操作,并利用顺序栈实现表达式的求解
时间: 2024-05-01 19:21:31 浏览: 131
用c语言来实现顺序栈
5星 · 资源好评率100%
以下是使用C语言实现顺序栈的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100 // 定义栈的最大容量
// 定义顺序栈结构体
typedef struct {
int data[MAXSIZE]; // 栈中元素
int top; // 栈顶指针
} SqStack;
// 初始化栈
void InitStack(SqStack *S) {
S->top = -1; // 栈顶指针初始化为-1
}
// 判断栈是否为空
int StackEmpty(SqStack S) {
if (S.top == -1) {
return 1;
} else {
return 0;
}
}
// 入栈操作
int Push(SqStack *S, int x) {
if (S->top == MAXSIZE - 1) { // 栈已满,无法入栈
return 0;
} else {
S->top++; // 栈顶指针加1
S->data[S->top] = x; // 将元素x入栈
return 1;
}
}
// 出栈操作
int Pop(SqStack *S, int *x) {
if (S->top == -1) { // 栈为空,无法出栈
return 0;
} else {
*x = S->data[S->top]; // 将栈顶元素赋值给x
S->top--; // 栈顶指针减1
return 1;
}
}
// 获取栈顶元素
int GetTop(SqStack S, int *x) {
if (S.top == -1) { // 栈为空,无法获取栈顶元素
return 0;
} else {
*x = S.data[S.top]; // 将栈顶元素赋值给x
return 1;
}
}
```
接下来是利用顺序栈求解表达式的代码。假设表达式中只包含整数、加号和减号,且表达式格式正确。
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h> // 包含isdigit函数
#define MAXSIZE 100 // 定义栈的最大容量
// 定义顺序栈结构体
typedef struct {
int data[MAXSIZE]; // 栈中元素
int top; // 栈顶指针
} SqStack;
// 初始化栈
void InitStack(SqStack *S) {
S->top = -1; // 栈顶指针初始化为-1
}
// 判断栈是否为空
int StackEmpty(SqStack S) {
if (S.top == -1) {
return 1;
} else {
return 0;
}
}
// 入栈操作
int Push(SqStack *S, int x) {
if (S->top == MAXSIZE - 1) { // 栈已满,无法入栈
return 0;
} else {
S->top++; // 栈顶指针加1
S->data[S->top] = x; // 将元素x入栈
return 1;
}
}
// 出栈操作
int Pop(SqStack *S, int *x) {
if (S->top == -1) { // 栈为空,无法出栈
return 0;
} else {
*x = S->data[S->top]; // 将栈顶元素赋值给x
S->top--; // 栈顶指针减1
return 1;
}
}
// 获取栈顶元素
int GetTop(SqStack S, int *x) {
if (S.top == -1) { // 栈为空,无法获取栈顶元素
return 0;
} else {
*x = S.data[S.top]; // 将栈顶元素赋值给x
return 1;
}
}
// 判断是否是运算符
int IsOperator(char ch) {
if (ch == '+' || ch == '-') {
return 1;
} else {
return 0;
}
}
// 计算表达式的值
int Calculate(char *exp) {
SqStack S;
InitStack(&S); // 初始化栈
int num = 0;
int flag = 1; // 用于处理负数
char ch = *exp;
while (ch != '\0') {
if (isdigit(ch)) { // 如果是数字,将其转化为整数
num = num * 10 + (ch - '0');
} else if (ch == '-') { // 如果是负号,标记flag为-1
flag = -1;
} else if (IsOperator(ch)) { // 如果是运算符,入栈并重置num和flag
num *= flag; // 处理负数
flag = 1;
Push(&S, num); // 先将上一个数字入栈
num = 0;
Push(&S, ch); // 再将运算符入栈
}
exp++; // 处理下一个字符
ch = *exp;
}
num *= flag; // 处理最后一个数字
Push(&S, num); // 将最后一个数字入栈
int x, y;
Pop(&S, &y); // 先出栈一个数字
while (!StackEmpty(S)) {
Pop(&S, &x); // 再出栈一个数字
Pop(&S, &ch); // 出栈一个运算符
if (ch == '+') { // 如果是加号,将x和y相加后再入栈
y += x;
} else if (ch == '-') { // 如果是减号,将y减去x后再入栈
y -= x;
}
}
return y;
}
int main() {
char exp[MAXSIZE];
printf("请输入表达式:");
scanf("%s", exp);
int result = Calculate(exp);
printf("计算结果为:%d", result);
return 0;
}
```
阅读全文