栈的表达主要有顺序表示和链式表达两种:
顺序表达;
#include<iostream>
#include<stdio.h>
//函数结果状态代码
#define MAXSIZE 100
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
//#define OVERFLOW -2
//Status 是函数的类型,其值是函数结果状态代码
typedef int Status,Elemtype, SElemType,QElemType;
using namespace std;
//栈:分为顺序栈和链
//顺序栈的表示如下
typedef struct
{
SElemType* base;//栈底指针
SElemType* top;//栈顶指针
int stacksize;//栈的大小
}SqStack;
//栈的初始化
Status InitStack(SqStack & S)
{
S.base = new SElemType[MAXSIZE]; //base指针指向首元素的地址,分配一块空间
if (!S.base) exit(OVERFLOW);//存储分配失败
S.base = S.top;
S.stacksize = MAXSIZE;
}
//判断栈是否为空
Status StackEmpty(SqStack S)
{
if(S.base==S.top)
return TRUE;
else
return FALSE;
}
//清空顺序栈(空间还在)
Status ClearStack(SqStack &S)//我觉得应该传递引用
{
if (S.base) //base存在即可
{
S.top = S.base;
}
return OK;
}
//销毁顺序表
Status DeleteStack(SqStack& S)
{
if (S.base)
{
delete S.base; //将开辟的空间清空,但指针还在;
S.stacksize = 0;
S.base = S.top = NULL;//将结构中的值也销毁了
}
return OK;
}
//入栈:将元素移到栈顶(栈满需要判断)
Status Push(SqStack& S, SElemType e)
{
if ((S.top - S.base) == S.stacksize) //栈满
return ERROR;
//S.base[S.top - S.base - 1] = e;//或者可以用下面的表达
*S.top = e;
S.top++;
//上面两步骤也可以合并成 *S.top++=e;
return OK;
}
//出栈:将元素移出(栈空需要判断)
Status Pop(SqStack& S, SElemType &e)
{
if (S.base == S.top)//判断是否为空
return ERROR;
e = *--S.top; //注意星号和--的位置
return OK;
}
栈的链式表达:
#include<iostream>
#include<stdio.h>
//函数结果状态代码
#define MAXSIZE 100
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
//#define OVERFLOW -2
//Status 是函数的类型,其值是函数结果状态代码
typedef int Status,Elemtype, SElemType,QElemType;
using namespace std;
//链栈的表示(栈用链表的形式表示)
//定义
typedef struct StackNode
{
SElemType data;
struct StackNode* next;
}StackNode,*LinkStack;
//链表的初始化
void InitStack(LinkStack& S)
{
S = NULL;//没用头结点;栈指针指着栈顶
}
//判断链栈是否为空
Status StackEmpty(LinkStack S)
{
if (S == NULL)
return TRUE;
else
return FALSE;
}
//链栈的入栈
Status Push(LinkStack& S, SElemType e)
{
LinkStack p;
p = new StackNode;
p->data = e;
p->next = S;
S = p;
return OK;
}
//链栈的出栈
Status Pop(LinkStack& S, SElemType& e)
{
if (S == NULL)
return ERROR;
e = S->data;
LinkStack p;
p= S;
S = S->next;
delete p;
return OK;
}
//取栈顶元素
SElemType Pop(LinkStack S)
{
if (S == NULL)
return ERROR;
return S->data;
}