栈,是操作受限的线性表,只能在一端进行插入删除。
其实就是带尾指针的链表,尾插
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define Status int
#define SElemType int
//只在头部进行插入和删除(不带头结点)
typedef struct LNode
{
SElemType data;
struct LNode *next;
}LNode, *LinkList;
typedef struct
{
LNode *top;
LNode *base;
int length;
}LinkStack;
Status InitStack(LinkStack &S)
{
S.base = NULL;
S.top = NULL;
S.length = 0;
return OK;
}
Status GetTop(LinkStack S, SElemType &e)
{
if(S.length == 0)
return ERROR;
e = S.top->data ;
return OK;
}
Status Push(LinkStack &S, SElemType e)
{
LNode *newNode = (LNode *)malloc(sizeof(LNode));
newNode->data = e;
newNode->next = S.top;
S.top = newNode;
if(!S.base)
S.base = newNode;
++S.length;
return OK;
}
Status Pop(LinkStack &S, SElemType &e)
{
LNode *p = S.top;
if(S.length == 0)
return ERROR;
e = S.top->data;
S.top = S.top->next;
free(p);
--S.length;
return OK;
}
void PrintStack(LinkStack S)
{
LNode *p = S.top;
printf("由栈顶到栈底:");
while (p)
{
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}
int main(void)
{
LinkStack LS;
InitStack(LS);
Push(LS,11);
Push(LS,22);
Push(LS,33);
Push(LS,44);
Push(LS,55);
PrintStack(LS);
SElemType e ;
GetTop(LS , e);
printf("栈顶元素是: %d\n",e);
Pop(LS,e);
PrintStack(LS);
Pop(LS,e);
PrintStack(LS);
return 0;
}