引言
棧(Stack)是一種進步後出(FILO)的數據構造,在C言語中,棧操縱是基本且重要的內容。本文將深刻淺出地介紹C言語中棧的操縱,特別是入棧(Push)技能,並經由過程實戰案例展示怎樣實現跟應用棧。
棧的基本不雅點
棧的定義
棧是一種線性數據構造,它遵守掉落隊先出(LIFO)的原則。這意味着最掉落隊入棧的元素將開始被移除。
棧的元素
棧由一系列元素構成,每個元素都有一個唯一的索引值,平日從0開端。
棧的操縱
- 入棧(Push):在棧頂增加一個新元素。
- 出棧(Pop):移除棧頂元素。
- 讀取棧頂元素(Peek):檢查棧頂元素但不移除。
- 斷定棧能否為空(IsEmpty):檢查棧中能否有元素。
C言語實現棧
棧的次序存儲構造
在C言語中,平日利用數組來實現棧的次序存儲構造。以下是一個簡單的棧構造定義:
#define MAXSIZE 100 // 定義棧的最大年夜容量
typedef struct {
int data[MAXSIZE]; // 棧中存儲的元素
int top; // 棧頂指針,初始值為-1
} Stack;
棧的初始化
void InitStack(Stack *s) {
s->top = -1; // 初始化棧頂指針為-1,表示棧為空
}
入棧操縱
int Push(Stack *s, int value) {
if (s->top >= MAXSIZE - 1) { // 檢查棧能否已滿
return -1; // 棧滿,前去錯誤代碼
}
s->top++; // 棧頂指針加1
s->data[s->top] = value; // 將元素壓入棧頂
return 0; // 入棧成功,前去0
}
實戰案例:打算器表達式求值
以下是一個利用棧打算算術表達式的示例:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define MAXSIZE 100
typedef struct {
int data[MAXSIZE];
int top;
} Stack;
void InitStack(Stack *s) {
s->top = -1;
}
int Push(Stack *s, int value) {
if (s->top >= MAXSIZE - 1) {
return -1;
}
s->top++;
s->data[s->top] = value;
return 0;
}
int Pop(Stack *s) {
if (s->top < 0) {
return -1;
}
int value = s->data[s->top];
s->top--;
return value;
}
int main() {
char expression[] = "3 + 5 * 8 - 2";
Stack numbers, operators;
InitStack(&numbers);
InitStack(&operators);
for (int i = 0; expression[i] != '\0'; i++) {
if (isdigit(expression[i])) {
Push(&numbers, expression[i] - '0');
} else if (expression[i] == '(') {
Push(&operators, expression[i]);
} else if (expression[i] == ')') {
while (!IsEmpty(&operators) && Pop(&operators) != '(');
} else if (expression[i] == '+' || expression[i] == '-' || expression[i] == '*' || expression[i] == '/') {
while (!IsEmpty(&operators) && precedence(expression[i], Pop(&operators))) {
int val2 = Pop(&numbers);
int val1 = Pop(&numbers);
char op = Pop(&operators);
Push(&numbers, applyOp(val1, val2, op));
}
Push(&operators, expression[i]);
}
}
while (!IsEmpty(&operators)) {
int val2 = Pop(&numbers);
int val1 = Pop(&numbers);
char op = Pop(&operators);
Push(&numbers, applyOp(val1, val2, op));
}
printf("Result: %d\n", Pop(&numbers));
return 0;
}
int precedence(char op1, char op2) {
if (op2 == '(' || op2 == ')') {
return 0;
}
if ((op1 == '*' || op1 == '/') && (op2 == '+' || op2 == '-')) {
return 0;
}
return 1;
}
int applyOp(int val1, int val2, char op) {
switch (op) {
case '+':
return val1 + val2;
case '-':
return val1 - val2;
case '*':
return val1 * val2;
case '/':
return val1 / val2;
default:
return 0;
}
}
在這個案例中,我們利用棧來打算一個簡單的算術表達式。起首,我們利用數字棧來存儲數字,利用操縱符棧來存儲操縱符。然後,我們遍歷表達式中的每個字符,根據字符範例履行響應的操縱。
總結
本文深刻淺出地介紹了C言語中棧的操縱,特別是入棧(Push)技能。經由過程實戰案例,我們展示了怎樣利用棧來打算算術表達式。盼望本文能幫助妳更好地懂得跟利用棧這一重要的數據構造。