- 栈(stack),是一种线性存储结构,它有以下几个特点: 栈中数据是按照"后进先出(LIFO, Last In First Out)"方式进出栈的。 向栈中添加/删除数据时,只能从栈顶进行操作。
- 栈的基本操作
基本操作 |
---|
initStack(&S) |
clearStack(&S) |
getLength(&S) |
pushStack(&S, e) |
stackTraverse(S, visit()) |
destroyStack(&S) |
isStackEmpty(&S) |
getTop(S, &e) |
popStack(&S, &e) |
实现代码:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define status int
#define INIT_SIZE 100
#define INCRE_SIZE 10
typedef int elem;
/* 顺序栈
栈顶指针(top)栈底指针(base)
后进先出(last in first out)LIFO
*/
typedef struct {
elem *top;
elem *base;
int stacksize;
}SqStack;
status initStack(SqStack * stack)
{
stack->base = (elem *)malloc(INIT_SIZE * sizeof(elem));
if(!stack->base) exit(-2);
stack->top = stack->base;
stack->stacksize = INIT_SIZE;
printf("STACK---INIT---SUCCESS\n\n");
return 1;
}
int isStackEmpty(SqStack *stack)
{
if(stack->top == stack->base) return 1;
return 0;
}
status pushStack(SqStack *stack, elem e)
{
if(stack->top - stack->base >= stack->stacksize){
stack->base = (elem *)realloc(stack->base ,(stack->stacksize + INCRE_SIZE) * sizeof(elem));
if(!stack->base) exit(-2);
printf("STACK---PUSH---SUCCESS\n\n");
stack->top = stack->base + stack->stacksize;
stack->stacksize += INCRE_SIZE;
}
*stack->top++ = e;
return 1;
}
status getTop(SqStack *stack, elem *e)
{
if(stack->top == stack->base){
printf("空栈");
return 0;
}
//改变e的值
*e = *(stack->top-1);
//返回栈顶元素
return 1;
}
//pop删除S的栈顶元素,并用e放回其值
status popStack(SqStack *stack, elem * e)
{
if(!isStackEmpty(stack)){
*e = *(--stack->top);
}
return 1;
}
//返回栈的长度
status getlength(SqStack *stack)
{
return stack->top - stack->base;
}
status clearStack(SqStack *stack)
{
stack->top = stack->base;
return 1;
}
//销毁栈
status destoryStack(SqStack *stack)
{
if(!stack->base)
free(stack->base);
return 1;
}
//对每一个站内元素调用一个函数
status stackTraverse(SqStack *stack, void visit())
{
if(!isStackEmpty(stack)){
elem *traver = stack->top;
while(stack->base == stack->top--){
visit(*stack->top);
}
stack->top = stack->base + getlength(stack);
}
return 1;
}
int main(int argc, char *argv[]) {
SqStack stack;
initStack(&stack); //初始化栈
for(int i = 0; i < 101; i++){
pushStack(&stack, i); //入栈
}
printf("length = %d\n", getlength(&stack));
for(int j = 0; j < 101; j++){
int e;
popStack(&stack, &e); //出栈
printf("%d\t", e);
}
printf("\n");
if(isStackEmpty(&stack))
printf("Stack Empty!\n");
else
printf("Stack is not Empty!\n");
printf("length = %d\n", getlength(&stack));
clearStack(&stack); //清空栈
// destoryStack(&stack);
return 0;
}