下面我将详细讲解如何用 C 语言实现栈的顺序结构并提供两个示例。
什么是栈?
栈是一种数据结构,特点是 Last In First Out (LIFO) 后进先出。栈具有两个基本操作:压入(push)和弹出(pop)。在栈的顺序结构中,栈被定义为一个固定大小的数组,其中有一个指针(top)指向栈的顶部元素。
栈的顺序结构实现
- 首先,我们需要定义栈的数据结构,包括栈的大小和栈顶指针。
#define MAXSIZE 100 // 栈的大小
typedef struct {
int data[MAXSIZE];
int top;
} Stack;
- 接下来,我们需要定义一些基本的操作函数,如 push 和 pop 。
// 初始化栈
void InitStack(Stack* s) {
s->top = -1;
}
// 判断栈是否为空
int IsEmpty(Stack* s) {
return s->top == -1;
}
// 判断栈是否已满
int IsFull(Stack* s) {
return s->top == MAXSIZE - 1;
}
// 入栈
int Push(Stack* s, int x) {
if (IsFull(s)) {
return 0; // 栈已满
}
s->top++;
s->data[s->top] = x;
return 1;
}
// 出栈
int Pop(Stack* s, int* x) {
if (IsEmpty(s)) {
return 0; // 栈已空
}
*x = s->data[s->top];
s->top--;
return 1;
}
示例一:括号匹配
括号匹配是栈的基本应用之一。我们可以使用栈来检查字符串中的括号是否匹配。具体做法是将左括号压入栈中,遇到右括号时弹出栈顶元素,并检查其是否是对应的左括号。
#include <stdio.h>
#include <string.h>
int IsPair(char left, char right) {
if (left == '(' && right == ')') {
return 1;
}
if (left == '[' && right == ']') {
return 1;
}
if (left == '{' && right == '}') {
return 1;
}
return 0;
}
int CheckParentheses(char* s) {
Stack stk;
InitStack(&stk);
for (int i = 0; i < strlen(s); i++) {
if (s[i] == '(' || s[i] == '[' || s[i] == '{') {
Push(&stk, s[i]);
} else if (s[i] == ')' || s[i] == ']' || s[i] == '}') {
int x;
if (Pop(&stk, &x) == 0 || IsPair(x, s[i]) == 0) {
return 0;
}
}
}
return IsEmpty(&stk) ? 1 : 0;
}
int main() {
char* s1 = "{(a+b)*(c+d)}";
char* s2 = "[[[(a+b)*(c+d])]]";
char* s3 = "{(a+b)*(c+d]))";
printf("%s: %d\n", s1, CheckParentheses(s1));
printf("%s: %d\n", s2, CheckParentheses(s2));
printf("%s: %d\n", s3, CheckParentheses(s3));
return 0;
}
以上程序输出结果为:
{(a+b)*(c+d)}: 1
[[(a+b)*(c+d)]]: 1
{(a+b)*(c+d])): 0
示例二:中缀表达式求值
中缀表达式是指二元运算符出现在操作数之间的表达式,如 3 + 4。我们可以使用栈来求解中缀表达式。
具体做法是维护两个栈,一个用于操作符,一个用于操作数。当遇到操作数时,将其压入操作数栈中;当遇到操作符时,比较操作符与操作符栈栈顶元素的优先级。如果操作符优先级大于栈顶操作符,则将其压入栈中;否则,弹出栈顶元素计算并将结果压入操作数栈中。当表达式扫描完成后,操作符栈中剩余的操作符应全部弹出并计算。
#include <stdio.h>
int GetPriority(char oper) {
if (oper == '(' || oper =='[' || oper == '{') {
return 0;
}
if (oper == '+' || oper == '-') {
return 1;
}
if (oper == '*' || oper == '/') {
return 2;
}
return -1;
}
double Calculate(double a, double b, char oper) {
switch (oper) {
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
case '/': return a / b;
default: return 0;
}
}
double EvalInfixExpression(char* expr) {
Stack opers, nums;
InitStack(&opers);
InitStack(&nums);
for (int i = 0; i < strlen(expr); i++) {
if (expr[i] >= '0' && expr[i] <= '9') {
double x = 0;
int j = i;
while (j < strlen(expr) && expr[j] >= '0' && expr[j] <= '9') {
x = x * 10 + (expr[j] - '0');
j++;
}
i = j - 1;
Push(&nums, x);
} else if (expr[i] == '+' || expr[i] == '-' || expr[i] == '*' || expr[i] == '/') {
while (!IsEmpty(&opers) && GetPriority(expr[i]) <= GetPriority(opers.data[opers.top])) {
double b, a;
Pop(&nums, &b);
Pop(&nums, &a);
char oper;
Pop(&opers, &oper);
double result = Calculate(a, b, oper);
Push(&nums, result);
}
Push(&opers, expr[i]);
} else if (expr[i] == '(' || expr[i] == '[' || expr[i] == '{') {
Push(&opers, expr[i]);
} else if (expr[i] == ')' || expr[i] == ']' || expr[i] == '}') {
while (!IsEmpty(&opers) && opers.data[opers.top] != '(' && opers.data[opers.top] != '[' && opers.data[opers.top] != '{') {
double b, a;
Pop(&nums, &b);
Pop(&nums, &a);
char oper;
Pop(&opers, &oper);
double result = Calculate(a, b, oper);
Push(&nums, result);
}
char left;
Pop(&opers, &left);
}
}
while (!IsEmpty(&opers)) {
double b, a;
Pop(&nums, &b);
Pop(&nums, &a);
char oper;
Pop(&opers, &oper);
double result = Calculate(a, b, oper);
Push(&nums, result);
}
double result;
Pop(&nums, &result);
return result;
}
int main() {
char* expr1 = "1+2*3-4/2";
char* expr2 = " 2 * ( 3 + 4 / ( 1 + 2 ) ) ";
printf("%s = %.2lf\n", expr1, EvalInfixExpression(expr1));
printf("%s = %.2lf\n", expr2, EvalInfixExpression(expr2));
return 0;
}
以上程序输出结果为:
1+2*3-4/2 = 5.00
2 * ( 3 + 4 / ( 1 + 2 ) ) = 8.00
这就是我们使用 C 语言实现栈的顺序结构的完整攻略,希望能对你有所帮助!
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言栈顺序结构实现代码 - Python技术站