堆栈是具有一定约束的线性表,只在一端即栈顶做插入和删除操作,具有后进先出的特点。比如放在桌上的一叠盘子,要从最上面的盘子(即后放上去的)开始取走。
栈的顺序存储实现
栈的顺序存储通常由一个一维数组和一个记录栈顶元素位置的变量组成。
1.定义顺序栈
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
#define MaxSize 100//储存数据的最大个数
typedef struct SNode* Stack;
struct SNode//定义顺序栈的结构
{
ElemType data[MaxSize];//储存元素的数组
int top;//记录栈顶元素位置
};
2.创建一个顺序栈
Stack CreateStack()//创建顺序栈
{
Stack L;
L = (Stack)malloc(sizeof(Stack));//给栈分配存储空间
L->top = -1;
return L;
}
3.判断顺序栈是否为空和已满
int IsEmpty(Stack L)//判断是否为空
{
return(L->top == -1);
}
int IsFull(Stack L)//判断是否已满
{
return(L->top == MaxSize - 1);
}
4.进栈和出栈
void Push(Stack L, ElemType e)//将元素e进栈
{
if (IsFull(L))//当堆栈已满时插入失败
{
printf("堆栈已满\n");
return;
}
else
{
L->data[++(L->top)] = e;
}
}
int Pop(Stack L,ElemType &e)//将栈顶元素出栈且赋值给e
{
if (IsEmpty(L))//当堆栈为空的时候出栈失败
{
printf("堆栈为空\n");
return 0;
}
else
{
e = L->data[(L->top)--];
}
}
栈的链式存储实现
栈的链式存储结构实际上就是一个单链表,叫做链栈,插入和删除操作只能在链栈的栈顶实现。
1.定义链栈
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct SNode* Stack;
struct SNode//定义一个链栈
{
ElemType Data;
struct SNode* Next;//栈顶指针
};
2.创建链栈
Stack Createtack()//构建一个链栈的头结点
{
Stack L;
L = (Stack)malloc(sizeof(struct SNode));
L->Next = NULL;
return L;
}
3.判断链栈是否为空
因为是一个链表,所以不去判断是否已满的情况。
int IsEmpty(Stack L)//判断是否为空
{
return(L->Next == NULL);
}
4.进栈和出栈
void Push(Stack L, ElemType e)//进栈
{
struct SNode* s;
s = (struct SNode*)malloc(sizeof(struct SNode));
s->Data = e;
s->Next = L->Next;
L->Next = s;
}
int Pop(Stack L, ElemType& e)//出栈
{
struct SNode* s;
if (IsEmpty(L))
{
printf("堆栈空\n");
return 0;
}
else
{
s=L->next;
e = s->Data;
L->Next = s->Next;
free(s);
return 1;
}
}