1.代码:
#include <stdio.h>
#include <malloc.h>
#define STACK_MAX_SIZE 10
/**
* 线性整数栈。关键字是数据。
*/
typedef struct CharStack {
int top;
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");
}
/**
* 初始化一个空字符栈。这个函数不进行错误检查。
* @param paraStackPtr 栈的指针。它必须是一个指针以便改变栈。
* @param paraValues 一个整数数组,存储所有元素。
*/
CharStackPtr charStackInit() {
CharStackPtr resultPtr = (CharStackPtr)malloc(sizeof(struct CharStack));
resultPtr->top = -1;
return resultPtr;
}
/**
* 向栈中推入一个元素。
* @param paraValue 被推入的值。
*/
void push(CharStackPtr paraStackPtr, int paraValue) {
// 第1步。空间检查。
if (paraStackPtr->top >= STACK_MAX_SIZE - 1) {
printf("无法推入元素:栈已满。\r\n");
return;
}
// 第2步。更新顶部。
paraStackPtr->top ++;
// 第3步。推入元素。
paraStackPtr->data[paraStackPtr->top] = paraValue;
}
/**
* 从栈中弹出一个元素。
* @return 被弹出的值。
*/
char pop(CharStackPtr paraStackPtr) {
// 第1步。空间检查。
if (paraStackPtr->top < 0) {
printf("无法弹出元素:栈为空。\r\n");
return '\0';
}
// 第2步。更新顶部。
paraStackPtr->top --;
// 第3步。弹出元素。
return paraStackPtr->data[paraStackPtr->top + 1];
}
/**
* 测试推入函数。
*/
void pushPopTest() {
printf("---- pushPopTest 开始。 ----\r\n");
// 初始化。
CharStackPtr tempStack = charStackInit();
printf("初始化后,栈为:");
outputStack(tempStack);
// 推入。
for (char ch = 'a'; ch < 'm'; ch ++) {
printf("推入 %c。\r\n", ch);
push(tempStack, ch);
outputStack(tempStack);
}
// 弹出。
for (int i = 0; i < 3; i ++) {
char ch = pop(tempStack);
printf("弹出 %c。\r\n", ch);
outputStack(tempStack);
}
printf("---- pushPopTest 结束。 ----\r\n");
}
/**
* 程序入口。
*/
void main() {
pushPopTest();
}
2.运行结果: