栈:栈是限定仅在表尾进行插入或删除的线性表。因此,对栈来说,表尾端有其特殊含义,称为栈顶,相应地,表头端称为栈底。不含元素的空表称为空栈。栈的修改是按后进先出的原则进行的,因此,栈又称为后进先出的线性表。
创建栈:
typedef struct CharStack {
int top;
int data[STACK_MAX_SIZE];
} *CharStackPtr;
栈的初始化:
CharStackPtr charStackInit() {
CharStackPtr resultPtr = (CharStackPtr)malloc(sizeof(CharStackPtr)); //申请内存
resultPtr->top = -1;
return resultPtr;
打印栈:
void outputStack(CharStackPtr paraStack) {
int i;
for (i = 0; i <= paraStack->top; i ++) {
printf("%c ", paraStack->data[i]);
}
printf("\r\n");
入栈:实际为从栈底开始,每传入一个元素,top指针向上指向上一位,直至max
void push(CharStackPtr paraStackPtr, int paraValue) {
if (paraStackPtr->top >= STACK_MAX_SIZE - 1) {
printf("栈空间已满,不能入栈\r\n");
return;
}
paraStackPtr->top ++;
paraStackPtr->data[paraStackPtr->top] = paraValue;
}
出栈:
char pop(CharStackPtr paraStackPtr) {
if (paraStackPtr->top < 0) {
printf("都没了,无法出栈\r\n");
return '\0';
}
paraStackPtr->top --;
return paraStackPtr->data[paraStackPtr->top + 1];
}
测试:
void pushPopTest() {
int i;
char ch;
printf("---- 弹压测试开始 ----\r\n");
// 初始化
CharStackPtr tempStack = charStackInit();
printf("初始化过后,这个栈是:");
outputStack(tempStack);
// 入栈
for (ch = 'a'; ch < 'm'; ch ++) {
printf("入栈: %c.\r\n", ch);
push(tempStack, ch);
outputStack(tempStack);
}
// 出栈
for (i = 0; i < 3; i ++) {
ch = pop(tempStack);
printf("出栈: %c.\r\n", ch);
outputStack(tempStack);
}
printf("---- 测试结束 ----\r\n");
}