/*
栈:是只允许在一端进行插入或者删除的线性表
栈的常规操作:
--InitStack(&S):初始化一个栈。构造一个空栈S,分配内存空间
--DestoryStack(&s):销毁并释放栈S所占用的内存空间
--Push(&S,x):进栈
--Pop(&S,&X):出栈
--GetTop(S,&x):读栈
--StackEmpty(s):判断一个栈S是否为空
*/
#include<stdio.h>
#include<stdlib.h>
#include<string>
//顺序栈
#define Maxsize 10
typedef int ElemType;//这里根据顺序表中数据的类型来定义,我们假设数据为int型。
typedef struct{
ElemType data[Maxsize];
int top;//栈顶指针
}SqStack;
//初始化栈
void InitStack(SqStack &S)
{
S.top=-1;
}
//新元素入栈
bool Push(SqStack &S,ElemType x)
{
if(S.top==Maxsize-1)
return false;
S.top++;
S.data[S.top]=x;
//上面两行可以写成S.data[++S.top]=x;
return true;
}
//出栈操作
bool Pop(SqStack &S,ElemType &x)
{
if(S.top==-1) return false;
x=S.data[S.top];
S.top--;
return true;
}
//读栈
bool GetTop(SqStack S,ElemType &X)
{
if(S.top==-1)return false;
X=S.data[S.top];
return true;
}
//判断栈空
bool StackEmpty(SqStack S){
if(S.top==-1)
return true;
else
return false;
}
//注意共享栈的存在
typedef struct{
ElemType data[Maxsize];
int top0; //0号栈顶指针
int top1; //1号栈顶指针
}ShStack;
//初始化一个栈
void InitStack(ShStack &S)
{//初始化栈顶指针
S.top0=-1;
S.top1=Maxsize;
}
//判断栈满的一个条件:top0+1==top1
//链式栈
//头插法简历单链表;
typedef struct LNode
{
ElemType data;
struct LNode *next;//指针指向下一个节点。
}LNode,*LinkList;
//后插操作:在p结点之后插入元素e
bool InsertNextNode(LNode *p,ElemType e)
{
if(p==NULL)
return false;
LNode *s=(LNode*)malloc(sizeof(LNode));
if(s==NULL)//分配失败
return false;
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
//------对应于进栈操作:规定指定在头结点的后面进行后插的操作
//------对头结点的“后删”操作--也就是出栈操作
//去定义一个链栈
typedef struct Linknode{
ElemType data;
struct Linknode *next;
}Linknode,*LiStack;
//不带头结点
//初始化一个栈
bool InitStack1(LiStack &L)
{
L==NULL;
return true;
}
//增--进栈
bool StackInsert(LiStack &L,ElemType e)
{
Linknode *s=(Linknode *)malloc(sizeof(Linknode));
if(s==NULL)return false;
s->next=L->next;
s->data=L->data;
L->data=e;
L->next=s;
return true;
}
//删--出栈
bool StackDelete(LiStack &L,ElemType &X)
{
X=L->data;
Linknode *s=(Linknode *)malloc(sizeof(Linknode));
if(s==NULL)return false;
s=L;
L=s->next;
free(s);
return true;
}
int main()
{
LiStack L;
}