栈是仅限在表尾进行插入和删除操作的线性表,同时由于栈特殊的数据元素操作方式,又称后进先出(Last In First Out)的线性表,简称为LIFO线性表。栈的抽象数据类型如下:
ADT 栈(Stack)
DATA
元素具有相同类型。相邻元素具有前驱和后继关系。
Operation
InitStack(*S) 制造空栈S
isEmpty(S) 判断栈是否为空
StackFull(S) 判断栈满
PushStack(*S,e) 进栈
PopStack(*S,*e) 出栈
endADT
#include <stdio.h>
#include <stdlib.h>
#include<malloc.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;
/*定义结点结构体*/
typedef struct Node{
int data;
struct Node *next; /*指向下一结点的指针*/
}NODE,*PNode;
/*定义栈的结构体*/
typedef struct Stack{
PNode Top; /*栈顶结点*/
}STACK,*pStack
/*函数声明*/
void initStack(pStack S);
Status PushStack(pStack S,ElemType e);
Status PopStack(pStack S,ElemType e);
Status isEmpty(pStack S);
/*栈初始化*/
void initStack(pStack S){
S->Top=(PNode)malloc(sizeof(NODE));
S->Bottom=(PNode)malloc(sizeof(NODE));
}
/*进栈*/
Status PushStack(pStack S,ElemType e){
PNode pNew=(PNode)mallo(sizeof(NODE));
pNew->data=e;
pNew->next=S->Top;
S->Top=pNew;
return OK;
}
/*出栈*/
Status PopStack(pStack S,ElemType *e){
if(isEmpty(S))
return FALSE;
PNode p=pStack->Top;
*e=p->data;
pStack->Top=p->next;
free(p);
return TRUE;
}
/*判断栈是否为空*/
Status isEmpty(pStack S){
if(S->Top==S->Bottom)
retrun TRUE;
else
return FALSE;
}