栈是限制在一段进行插入操作和删除操作的线性表(俗称堆栈),允许进行操作的一端称为“栈顶”,另一固定端称为“栈底”,当栈中没有元素称为“空栈”。特点:先进后出(FILO)。
栈顶即top,这里top有两种定义方式:
1、满栈(Full Stack),top指向最后一个使用的空间;
2、空栈(Empty Stack),top指向下一个可用的空间;
栈也是线性表,所以也分顺序存储和链式存储:
一、顺序存储
栈是顺序表的一种,具有顺序表同样的存储结构,由数组定义,配合用数组下表表示的栈顶指针top(相对指针)完成各种操作。
- typedef int data_t;
- typedef struct
- {
- date_t *data;
- int maxlen;
- int top;
- }seqstack_t;
如图,我们可以看到,栈的顺序存储与顺序表的区别,顺序表数组大小是固定的,这样限制了我们的后期修改,而栈的顺序存储将数据域单独开辟了一片空间才存放,大小为maxlen*sizeof(data_t), 下面是栈的基本运算:
1、创建栈
- seqstack_t *CreateEmptyStack(int max_len)
- {
- seqstack_t *stack;
- stack = (seqstack_t *)malloc(sizeof(seqstack_t));
- stack->data = (data_t *)malloc(sizeof(data_t)*max_len);
- stack->top = -1;
- stack->max_len = max_len;
-
- return stack;
- }
2、摧毁一个栈
- void DestroyStack(seqstack_t *stack)
- {
- if(stack != NULL)
- {
- if(stack->data != NULL)
- free(stack->data);
-
- free(stack);
- }
- }
3、清空一个栈
- void ClearStack(seqstack_t *stack)
- {
- if(stack != NULL)
- stack->top = -1;
- }
4、判断栈是否为空
- int EmptyStack(seqstack_t *stack)
- {
- if(stack == NULL)
- return -1;
-
- return(stack->top == -1 ? 1 : 0);
- }
5、判断栈是否为满
- int FullStack(seqstack_t *stack)
- {
- if(stack == NULL)
- return -1;
-
- return(stack->top == (stack->max_len - 1) ? 1 : 0);
- }
6、进栈
- int PushStack(seqstack_t *stack ,data_t x)
- {
- if(FullStack(stack))
- return -1;
- else
- {
- stack->top++;
- stack->data[stack->top] = x;
- }
-
- return 0;
- }
7、出栈
- int PopStack(seqstack_t *stack,data_t *x)
- {
- if(EmptySqstack(stack))
- return -1;
- else
- {
- *x = stack->data[stack->top];
- stack->top--;
- }
-
- return 0;
- }
8、取栈顶元素
- int GetTop(seqstack_t *stack,data_t *x)
- {
- if(EmptyStack(stack))
- return -1;
- else
- *x = stack->data[stack->top];
-
- return 0;
- }