1 栈
从数据结构角度来讲,栈也是线性表,其操作是线性表操作的子集,属操作受限的线性表。
但从数据类型的角度看,它们是和线性表大不相同的重要抽象数据类型。
◆ 栈是只准在一端进行插入和删除操作的线性表,该端称为栈的顶端。
栈顶(
Top
):线性表允许插入和删除的一端
栈底(Bottom
):固定的,不允许进行插入和删除的一端
2 栈的基本操作
从栈顶删除最后一个元素的操作,称为出栈。
插入元素到栈顶的操作,称为入栈。
对于向上生成的堆栈:
入栈口诀:堆栈指针
top
“先压后加” :S[top++]=x
出栈口诀:堆栈指针top
“先减后弹” :e=S[--top]
top==-1
为空则栈空
top==maxsize-1
为真则栈满
3 顺序栈代码实现
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE (20)
typedef int ElementType;
typedef struct SqStack {
ElementType data[MAXSIZE];
int top;
} *Stack;
Stack InitStack(void) //初始化栈
{
Stack s = (Stack)malloc(sizeof(struct SqStack));
s->top = -1;
return s;
}
void Push(Stack s, ElementType e) //压栈,将元素e插入到栈S中,作为S的新栈顶
{
if (s->top == MAXSIZE - 1) { //栈满
return;
}
s->top++;
s->data[s->top] = e;
}
void Pop(Stack s, ElementType *e) //出栈,若栈S不为空,则删除栈顶元素
{
if (s->top == -1) { //栈空
return;
}
*e = s->data[s->top];
s->top--;
}
void PrtStack(Stack s)
{
for (int i = 0; i <= s->top; i++) {
printf("%d ", s->data[i]);
}
printf("\n");
}
int main(void)
{
ElementType e;
Stack s = InitStack();
PrtStack(s);
printf("please input a element :");
scanf("%d", &e);
Push(s, e);
PrtStack(s);
Pop(s, &e);
printf("Pop a element : %d", e);
return 0;
}