数据结构之堆栈
堆栈如同前面的链表一样,也是线性结构。也可以用数组和链表两种方式来实现。堆栈遵循FILO(先入后出),主要操作包括入栈、出栈,等同于链表的插入和删除,不同的是链表可以在任意地方进行插入删除操作而堆栈的入栈和出栈相当于在链表的头节点处进行插入和删除操作。还是直接贴代码。
#ifndef STACK_H
#define STACK_H
struct Node;
typedef Node *PtrToNode;
typedef PtrToNode Stack;
typedef PtrToNode Position;
typedef int ElementType;
Stack CreateStack(void);
int IsEmpty(Stack S);
void POP(Stack S);
void PUSH(ElementType X,Stack S);
ElementType Top(Stack S);
void MakeEmpty(Stack S);
struct Node
{
ElementType Element;
Position *next;
};
#endif
#include"Stack.h"
//判断是否为空
int IsEmpty(Stack S)
{
return S->next==NULL;
}
//创建栈
Stack CreateStack(void)
{
Stack S;
S=(Stack)malloc(sizeof(struct Node));
if(S==NULL)
printf("out of space!");
S->next=NULL;
return S;
}
//
void MakeEmpty(Stack S)
{
if(S==NULL)
printf("must create stack fist!");
else
while(S->next!=NULL)
POP(S);
}
//
void POP(Stack S)
{
PtrToNode temp;
if(S->next==NULL)
printf("the stack is empty!");
else{
temp=S->next;
S->next=S->next->next;
free(temp);
}
}
//
ElementType Top(Stack_List S)
{
if(S->next==NULL)
printf("the stack is empty!");
else
return S->next->Element;
}
//
void PUSH(ElementType X,Stack S)
{
PtrToNode NewNode;
NewNode=(PtrToNode)malloc(sizeof(struct Node));
if(NewNode==NULL)
printf("out of space!");
else
{
NewNode->Element=X;
NewNode->next=S->next;
S->next=NewNode;
}
}
堆栈主要可以用在一些保存现场的情况下,单片机发生中断时需要保存现场,将此时的数据全部入栈,中断完成之后再出栈。
另外递归调用的时候每一次递归则把上次结果入栈,递归结束后将之前的结果出栈。