数据结构06-栈
数据结构06-栈
代码
#include <stdio.h>
#include <stdlib.h>
#define STACK_MAX_SIZE 10 // 定义栈的最大容量
// 定义一个字符栈的结构体
typedef struct CharStack {
int top; // 栈顶指针,初始化为-1,表示栈为空
int data[STACK_MAX_SIZE]; // 栈的存储数组,最大长度固定
} *CharStackPtr;
// 输出栈中的元素
void outputStack(CharStackPtr paraStack) {
for (int i = 0; i <= paraStack->top; i ++) {
printf("%c ", paraStack->data[i]);
}
printf("\r\n");
}
// 初始化一个空的字符栈
CharStackPtr charStackInit() {
CharStackPtr resultPtr = (CharStackPtr)malloc(sizeof(struct CharStack));
resultPtr->top = -1; // 初始化栈顶指针为-1
return resultPtr;
}
// 向栈中推入一个元素
void push(CharStackPtr paraStackPtr, int paraValue) {
if (paraStackPtr->top >= STACK_MAX_SIZE - 1) { // 检查栈空间是否已满
printf("Cannot push element: stack full.\r\n");
return;
}
paraStackPtr->top++; // 更新栈顶指针
paraStackPtr->data[paraStackPtr->top] = paraValue; // 将元素推入栈中
}
// 从栈中弹出一个元素
char pop(CharStackPtr paraStackPtr) {
if (paraStackPtr->top < 0) { // 检查栈是否为空
printf("Cannot pop element: stack empty.\r\n");
return '\0'; // 如果栈为空,返回空字符
}
paraStackPtr->top--; // 更新栈顶指针
return paraStackPtr->data[paraStackPtr->top + 1]; // 返回弹出的元素
}
// 测试push和pop函数
void pushPopTest() {
printf("---- pushPopTest begins. ----\r\n");
CharStackPtr tempStack = charStackInit(); // 初始化栈
printf("After initialization, the stack is: ");
outputStack(tempStack);
// 推入元素
for (char ch = 'a'; ch < 'm'; ch ++) {
printf("Pushing %c.\r\n", ch);
push(tempStack, ch);
outputStack(tempStack);
}
// 弹出元素
char ch;
for (int i = 0; i < 3; i ++) {
ch = pop(tempStack);
printf("Pop %c.\r\n", ch);
outputStack(tempStack);
}
printf("---- pushPopTest ends. ----\r\n");
}
// 程序入口点
int main() {
pushPopTest(); // 运行测试函数
}
代码总结:
-
定义了一个固定大小的栈(
STACK_MAX_SIZE
为10),用于存储字符。 -
CharStack
结构体包含一个栈顶指针top
和一个数据数组data
。栈顶指针初始化为-1,表示栈为空。 -
charStackInit
函数用于初始化一个空栈,并返回栈的指针。 -
push
函数用于向栈中推入一个新元素。它首先检查栈是否已满,如果未满,则将新元素推入栈顶。 -
pop
函数用于从栈中弹出一个元素。它首先检查栈是否为空,如果不为空,则弹出栈顶元素并返回。 -
outputStack
函数用于输出栈中的所有元素。 -
pushPopTest
函数是一个测试函数, 用于测试push
和pop
操作。它首先初始化一个栈,然后连续推入一系列字符,之后弹出几个字符,每次操作后都输出栈的当前状态。 -
main
函数是程序的入口点,它调用pushPopTest
函数来执行测试。