/*******************************************************************************
/* <PRE>
/* 版权所有 : -
/* 模块名 : 栈和队列
/* 文件名 : lstack.cpp
/* 功能描述 : 链栈的表示与实现
/* 作者 : <xxx>
/* 版本 : 1.0
/* -----------------------------------------------------------------------------
/* 备注 : -
/* -----------------------------------------------------------------------------
/* 修改记录 :
/* 日 期 版本 修改人 修改内容
/* 2011/01/01 1.0 <xxx> 创建
/* </PRE>
*******************************************************************************/
#include "stdio.h"
#include "stdlib.h"
/******************************************************************************
/* 数据类型和常量定义
/******************************************************************************/
typedef int Status;
typedef int SElemType;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
/******************************************************************************
/* 数据结构声明
/******************************************************************************/
typedef struct SNode {
SElemType data;
struct SNode *next;
}SNode;
typedef struct LinkStack {
SNode *base;
SNode *top;
}LinkStack;
/*******************************************************************************
/* <FUNC>
/* 函数名 : InitStack
/* 功能 : 构造空栈
/* 参数 : -
/* 返回值 : -
/* 备注 : -
/* 作者 : <xxx>
/* </FUNC>
*******************************************************************************/
Status InitStack(LinkStack &S) {
S.top = S.base = NULL;
return OK;
}
/*******************************************************************************
/* <FUNC>
/* 函数名 : Push
/* 功能 : 入栈
/* 参数 : -
/* 返回值 : -
/* 备注 : 插入元素e为新的栈顶元素
/* 作者 : <xxx>
/* </FUNC>
*******************************************************************************/
Status Push(LinkStack &S, SElemType e) {
SNode *p = (SNode *)malloc(sizeof(SNode));
if (!p) exit(OVERFLOW);
p->data = e;
p->next = S.top;
S.top = p;
return OK;
}
/*******************************************************************************
/* <FUNC>
/* 函数名 : Push
/* 功能 : 出栈
/* 参数 : -
/* 返回值 : -
/* 备注 : 若栈不空, 则删除S的栈顶元素, 用e返回其值, 并返回OK; 否则返回ERROR
/* 作者 : <xxx>
/* </FUNC>
*******************************************************************************/
Status Pop(LinkStack &S, SElemType &e) {
if (S.top == S.base)
return ERROR;
SNode *p = S.top;
S.top = S.top->next;
e = p->data;
free(p);
return OK;
}
/*******************************************************************************
/* <FUNC>
/* 函数名 : StackEmpty
/* 功能 : 判断栈是否为空
/* 参数 : -
/* 返回值 : -
/* 备注 : 若栈空则返回TRUE; 否则返回FALSE
/* 作者 : <xxx>
/* </FUNC>
*******************************************************************************/
Status StackEmpty(LinkStack S)
{
if (S.base == S.top) return TRUE;
else return FALSE;
}
/*******************************************************************************
/* <FUNC>
/* 函数名 : main
/* 功能 : 测试函数
/* 参数 : -
/* 返回值 : -
/* 备注 : -
/* 作者 : <xxx>
/* </FUNC>
*******************************************************************************/
void main()
{
LinkStack S; SElemType e;
InitStack(S);
Push(S, 10);
Push(S, 20);
if(OK == Pop(S, e)) printf("%d\n", e);
if(OK == Pop(S, e)) printf("%d\n", e);
if(OK == Pop(S, e)) printf("%d\n", e);
}
/* <PRE>
/* 版权所有 : -
/* 模块名 : 栈和队列
/* 文件名 : lstack.cpp
/* 功能描述 : 链栈的表示与实现
/* 作者 : <xxx>
/* 版本 : 1.0
/* -----------------------------------------------------------------------------
/* 备注 : -
/* -----------------------------------------------------------------------------
/* 修改记录 :
/* 日 期 版本 修改人 修改内容
/* 2011/01/01 1.0 <xxx> 创建
/* </PRE>
*******************************************************************************/
#include "stdio.h"
#include "stdlib.h"
/******************************************************************************
/* 数据类型和常量定义
/******************************************************************************/
typedef int Status;
typedef int SElemType;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
/******************************************************************************
/* 数据结构声明
/******************************************************************************/
typedef struct SNode {
SElemType data;
struct SNode *next;
}SNode;
typedef struct LinkStack {
SNode *base;
SNode *top;
}LinkStack;
/*******************************************************************************
/* <FUNC>
/* 函数名 : InitStack
/* 功能 : 构造空栈
/* 参数 : -
/* 返回值 : -
/* 备注 : -
/* 作者 : <xxx>
/* </FUNC>
*******************************************************************************/
Status InitStack(LinkStack &S) {
S.top = S.base = NULL;
return OK;
}
/*******************************************************************************
/* <FUNC>
/* 函数名 : Push
/* 功能 : 入栈
/* 参数 : -
/* 返回值 : -
/* 备注 : 插入元素e为新的栈顶元素
/* 作者 : <xxx>
/* </FUNC>
*******************************************************************************/
Status Push(LinkStack &S, SElemType e) {
SNode *p = (SNode *)malloc(sizeof(SNode));
if (!p) exit(OVERFLOW);
p->data = e;
p->next = S.top;
S.top = p;
return OK;
}
/*******************************************************************************
/* <FUNC>
/* 函数名 : Push
/* 功能 : 出栈
/* 参数 : -
/* 返回值 : -
/* 备注 : 若栈不空, 则删除S的栈顶元素, 用e返回其值, 并返回OK; 否则返回ERROR
/* 作者 : <xxx>
/* </FUNC>
*******************************************************************************/
Status Pop(LinkStack &S, SElemType &e) {
if (S.top == S.base)
return ERROR;
SNode *p = S.top;
S.top = S.top->next;
e = p->data;
free(p);
return OK;
}
/*******************************************************************************
/* <FUNC>
/* 函数名 : StackEmpty
/* 功能 : 判断栈是否为空
/* 参数 : -
/* 返回值 : -
/* 备注 : 若栈空则返回TRUE; 否则返回FALSE
/* 作者 : <xxx>
/* </FUNC>
*******************************************************************************/
Status StackEmpty(LinkStack S)
{
if (S.base == S.top) return TRUE;
else return FALSE;
}
/*******************************************************************************
/* <FUNC>
/* 函数名 : main
/* 功能 : 测试函数
/* 参数 : -
/* 返回值 : -
/* 备注 : -
/* 作者 : <xxx>
/* </FUNC>
*******************************************************************************/
void main()
{
LinkStack S; SElemType e;
InitStack(S);
Push(S, 10);
Push(S, 20);
if(OK == Pop(S, e)) printf("%d\n", e);
if(OK == Pop(S, e)) printf("%d\n", e);
if(OK == Pop(S, e)) printf("%d\n", e);
}