堆栈(Stack): 具有一定操作约束的线性表
只在一端(栈顶,top)做插入,删除
插入数据:入栈 (Push)
删除数据:出栈(Pop)
先入后出:Last in First Out
例子:平时洗碗的时候的碗洗完后放在最底端相当于push 然后清洗的时候相当于pop
类型名称:堆栈(Stack)
数据对象集:一个零个或多个元素的有穷线性表。
操作集:长度为MaxSize的堆栈S Statck,堆栈元素item属于 ElementType
方法1.Statck CreateStatck(int MaxSize):生成空堆栈,其最大长度为MaxSize;
方法2.int IsFull(Statck S,int MaxSize); 判断堆栈S是否已满;
方法3.void push(Stack S,ElementType item):将元素item压入堆栈;
方法4.int IsEmpty(Statck S):判断堆栈是否为空;
方法5.ElementType Pop(Stack S);删除并返回栈顶元素
#include<iostream>
using namespace std;
//顺序栈
//顺序栈的定义
#define MaxSize 10 //储存数据元素的最大个数
typedef struct{
int Data[MaxSize];
int Top; //指示栈顶的位置
}Stack;
//基本操作方法
void push(Stack* Ptrs,int item) //入栈
{
if(Ptrs->Top == MaxSize-1){
cout<<"堆栈满"<<endl;
return;
}else{
Ptrs->Data[++(Ptrs->Top)] = item;
return;
}
}
int pop(Stack *Ptrs) //出栈
{
if(Ptrs->Top == -1){
cout<<"堆栈空"<<endl;
return 0;
}else
return (Ptrs->Data[Ptrs->Top--]);
}
链栈
链栈式的存储结构实际上就是一个单链表叫做链栈。插入和删除操作只能在链栈的栈顶进行
/链栈
typedef struct Node{
int Data;
struct Node* Next;
}LinkStack;
LinkStack* Top;
//链表的创建
LinkStack* CreateStack() /*构建一个堆栈的头结点返回指针*/
{
LinkStack* S;
S = (LinkStack*)malloc(sizeof(struct Node));
S->Next = NULL;
return S;
}
int IsEmpty(LinkStack* S)
{/*判断堆栈S是否为空*/
return (S->Next == NULL);
}
void Push(int Data,LinkStack *S) //链表的添加
{
LinkStack* Tmpcell = (LinkStack*)malloc(sizeof(LinkStack));
Tmpcell->Data = Data;
Tmpcell->Next = S->Next;
S->Next = Tmpcell;
}
int Pop(LinkStack* S)
{ //删除并返回栈顶的元素
struct Node* FirstCell; //变量作用释放内存
int TopElem;
if(IsEmpty(S))
{
cout<<"堆栈空"<<endl;
return NULL;
}
else
{
TopElem = S->Data;
FirstCell = S->Next;
S->Next = FirstCell->Next;
free(FirstCell);
return TopElem;
}
}
void show(LinkStack *S)
{
LinkStack *a = (LinkStack*)malloc(sizeof(struct Node));
a = S->Next;
while(a)
{
cout<<a->Data<<endl;
a = a->Next;
}
}