栈是一个特殊的线性表,只能在一端操作;
栈顶(top):允许操作 的一端;栈底(bottom):不允许操作的一端
堆栈的定义
栈顶top:允许插入和删除的一端;
栈底bottom:另外一端;
2. 空栈:不含任何数据元素的栈;top=-1;
3. 栈的操作:
进栈,压栈,入栈:栈的插入操作;
出栈,弹栈:栈的删除操作;
栈中有一个元素时,top=0;
4. 栈的抽象数据类型:插入和删除:push,pop 同线性表。 元素具有相同的类型,相邻元素具有前驱和后继的的关系。
栈的结构:
typedef struct sqStack{
int data[MAXSIZE];
int top;
}STACK;
进栈操作:
int Push(STACK *S, int e)
{
if(S->top == MAXSIZE -1)
return error;//表示栈满
S->top++;
S->data[S->top]=e;
return OK;
}
出栈操作:
int Pop(STACK *S, int *e)
{
if(S->top == -1)
return ERROR;//表示栈空
*e=S->data[S->top];
S->top--;
return OK;
}
一种特殊的堆栈:共享栈
链式栈:
代码如下:
typedef struct StackNode
{
int data;
struct StackNode *next;
}StackNode, *LinkStackPtr;
typedef struct LinkStack
{
LinkStackPtr top;
int count;
}LinkStack;
进栈操作:元素值为e的新节点s,top为栈顶指针;
int Push(LinkStack *S, int e)
{
LinkStackPtr p=(LinkStackPtr) malloc (sizeof(StackNode));
p->data=e;
p->next=S->top;
S->top=p;
S->count++;
return OK;
}
pop操作:用变量p用来存储要删除的栈顶结点,将栈顶指针向下移动一位,最后释放p即可。
int Pop(LinkStack *S, int *e)
{
LinkStackPtr p;
if(StackEmpty(*S))
return ERROR;
*e=S->top->data;
p=S->top;
S->top=S->top->next;
free(p);
S->count--;
reuturn OK;
}