单链表实现栈
/*
链栈
*/
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <iomanip>
#define ElemType int //栈数据类型
#define OK 0 //操作成功执行
#define ERROR -1 //操作失败
#define OVERFLOW -2 //溢出
typedef int Status;
typedef struct SNode {
ElemType data; //数据域
struct SNode *next; //指针域
}SNode, *LinkStack;
Status InitStack_L(LinkStack *S); //1.创建
Status DestroyStack_L(LinkStack S); //2.销毁
Status ClearStack_L(LinkStack S); //3.清空
Status StackEmpty_L(LinkStack S); //4.判空
int StackLength_L(LinkStack S); //5.求长
ElemType GetTop_L(LinkStack S); //6.返回栈顶元素
Status Push(LinkStack S, ElemType e); //7.压栈
Status Pop(LinkStack S, ElemType *e); //8.弹栈
Status StackTraverse_L(LinkStack S); //9.遍历
/*
Status InitStack_L(LinkStack *S) //1.创建
{
S = (LinkStack *)malloc(sizeof(SNode));
(*S)->data = 0;
(*S)->next = NULL;
return OK;
}
*/
LinkStack InitStack_L() //1.创建
{
LinkStack S;
S = (LinkStack)malloc(sizeof(SNode));
S->data = 0;
S->next = NULL;
return S;
}
Status DestroyStack_L(LinkStack S) //2.销毁
{
SNode *p, *q;
p = S->next;
while (p)
{
q = p->next;
free(p);
p = q;
}
free(S);
S = NULL;
return OK;
}
Status ClearStack_L(LinkStack S) //3.清空
{
SNode *p, *q;
p = S->next;
while (!p)
{
q = p->next;
free(p);
p = q;
}
S->data = 0;
S->next = NULL;
return OK;
}
Status StackEmpty_L(LinkStack S) //4.判空
{
if (S->next == NULL) return 1;
else return 0;
}
int StackLength_L(LinkStack S) //5.求长
{
return S->data;
/*
SNode *p;
p = S;
int j = 0;
while (!p->next)
{
p = p->next;
j++;
}
return j;
*/
}
ElemType GetTop_L(LinkStack S) //6.返回栈顶元素
{
return S->next->data;
/*
SNode *p;
p = S;
int j = 0;
while (p && j < i)
{
p = p->next;
j++;
if (p && j == i)return p->data;
}
if (!p || j > i)return ERROR;
*/
}
Status Push(LinkStack S, ElemType e) //7.压栈
{
SNode *p, *q;
p = S->next;
q = (SNode *)malloc(sizeof(SNode));
q->data = e;
q->next = p;
S->next = q;
S->data++;
return OK;
}
Status Pop(LinkStack S, ElemType *e) //8.弹栈
{
SNode *p;
p = S->next;
S->next = p->next;
*e = p->data;
free(p);
S->data--;
return OK;
}
Status StackTraverse_L(LinkStack S) //9.遍历
{
SNode *p;
p = S->next;
for (int i = 0; i < StackLength_L(S); i++)
{
printf("%d ", p->data);
p = p->next;
}
return OK;
}
int main(int argc, char *argv[])
{
ElemType e;
LinkStack S;
S = InitStack_L();
Push(S, 1);
Push(S, 2);
printf("%d\n", GetTop_L(S));
Push(S, 3);
Push(S, 4);
while (!StackEmpty_L(S))
{
Pop(S, &e);
printf("%d ", e);
}
//StackTraverse_L(S);
DestroyStack_L(S);
//std::cout << "666" << std::endl;
return 0;
}
网友评论