堆栈(Stack):具有一定操作约束的线性表
只在一端(栈顶,Top)做插入和删除
1、栈的顺序存储实现
栈的顺序存储结构通常由一个一维数组和一个记录栈顶元素位置的变量组成。
(1)存储
#define MaxSize <储存数据元素的最大个数>
typedef struct
{
ElementType Data[MaxSize]
int Top;
}Stack;
(2)入栈
void Push(Stack *PtrS, ElementType item)
{
if (PtrS->Top == MaxSize-1)
{
printf("堆栈满");
return;
}else
{
PtrS->Data[++(PtrS->Top)] = item;
return;
}
}
(3)出栈
ElementType Pop(Stack *PtrS)
{
if (PtrS->Top == -1)
{
printf("堆栈空");
return ERROR;
}else
{
return (PtrS->Data[(PtrS->Top)--]);
}
}
2、堆栈的链式存储实现
栈的链式存储结构实际上就是一个单链表,叫做链栈。
插入和删除操作只能在栈链的栈顶进行
栈顶指针Top应该指向链表的头结点
(1)初始化
typedef struct Node
{
ElementType Data;
struct Node *Next;
} LinkStack;
LinkStack *Top;
LinkStack *CreateStack()
{ /* 构建一个堆栈的头结点,返回指针 */
LinkStack *S;
S = malloc( sizeof(struct Node ));
S->Next = NULL;
return S;
}
int IsEmpty( LinkStack *S )
{ /*判断堆栈S是否为空,若为空函数返回整数 1,否则返回0 */
return ( S->Next == NULL );
}
(2)入栈
void Push( ElementType item, LinkStack *S )
{ /* 将元素item压入堆栈S */
struct Node *TmpCell;
TmpCell = malloc( sizeof( struct Node ) );
TmpCell->Element = item;
TmpCell->Next = S->Next;
S->Next = TmpCell;
}
(3)出栈
ElementType Pop( LinkStack *S )
{ /* 删除并返回堆栈S的栈顶元素 */
struct Node *FirstCell;
ElementType TopElem;
if( IsEmpty( S ) )
{
printf(“堆栈空”);
return NULL;
}else
{
FirstCell = S->Next;
S->Next = FirstCell->Next;
TopElem = FirstCell ->Element;
free(FirstCell);
return TopElem;
}
}