顺序存储结构
#define MAXSIZE 50 //定义栈中元素的最大个数
typedef int ElemType; //ElemType的类型根据实际情况而定,这里假定为int
typedef struct{
ElemType data[MAXSIZE];
int top; //用于栈顶指针
}SqStack;
(1)初始化
void InitStack(SqStack &S){
S.top = -1; //初始化栈顶指针
}
(2)判栈空
bool StackEmpty(SqStack S){
if(S.top == -1){
return true; //栈空
}
else{
return false; //不空
}
}
(3)进栈
/*插入元素e为新的栈顶元素*/
Status Push(SqStack& S, ElemType e){
//满栈
if(S.top == MAXSIZE-1){
return ERROR;
}
S.top++; //栈顶指针增加一
S.data[S.top] = e; //将新插入元素赋值给栈顶空间
return OK;
}
(4)出栈
Status pop(Stack &S, int& e) {
if (S.top == -1) {
return ERROR
}
e = S.data[S.top--];
}
(5)读取栈顶元素
/*读栈顶元素*/
Elem GetTop(SqStack. S){
if (S.top == -1) {
return ERROR;
}
int e =S.data[S.top];
return e;
}
链式存储结构
/*栈的链式存储结构*/
/*构造节点*/
typedef struct StackNode{
ElemType data;
struct StackNode *next;
}StackNode, *LinkStackPrt;
/*构造链栈*/
typedef struct LinkStack{
LinkStackPrt top;
int count;
}LinkStack;
(1)进栈
/*插入元素e为新的栈顶元素*/
Status Push(LinkStack *S, ElemType e){
LinkStackPrt p = (LinkStackPrt)malloc(sizeof(StackNode));
p->data = e;
p->next = S->top; //把当前的栈顶元素赋值给新节点的直接后继
S->top = p; //将新的结点S赋值给栈顶指针
S->count++;
return OK;
}
(2)出栈
/*若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR*/
Status Pop(LinkStack *S, ElemType *e){
LinkStackPtr p;
if(StackEmpty(*S)){
return ERROR;
}
*e = S->top->data;
p = S->top; //将栈顶结点赋值给p
S->top = S->top->next; //使得栈顶指针下移一位,指向后一结点
free(p); //释放结点p
S->count--;
return OK;
}
双堆栈结构
typedef struct SNode{
ElementType *Data;
int Top1;//堆栈1的栈顶指针
int Top2;//堆栈2的栈顶指针
int MaxSize;//堆栈最大容量
}SNode*,PTSNode;
(1)初始化
PTSNode Create(int MaxSize){
PTSNode S=(PTSNode)malloc(sizeof(struct SNode));
S->Data=(ElementType*)malloc(MaxSize*sizeof(ElementType));
S->Top1=-1;
S->Top2=MaxSize;
return S;
}
ps:top指针为两个栈的栈顶指针,将一个数组分为两个部分
(2)入栈
bool push(PTSNode S,ElementType X,int Tag){
//Tag为区分两个栈的序号
if(S->Top2-S->Top1==1){
printf("堆栈满\n");
return false;
}
else{
if(Tag==1){
S->Data[++(S->Top1)]=X;
}
else{
S->Data[--(S->Top2)]=X;
}
return true;
}
}
(3)出栈
ElementType pop(PTSNode S,int Tag){
if(Tag==1){
if(S->Top1==-1){
printf("堆栈1空\n");
return ERROR;
}
else{
return S->Data[(S->Top1)--];
}
}
else{
if(S->Top2==S->MaxSize){
printf("堆栈2空\n");
return ERROR;
}
else{
return S->Data[(S->Top2)++];
}
}
}