#include<stdio.h>
#include<stdlib.h>
#define STACK_INIT_SIZE 100
#define STACKINCRMENT 10
#define OK 1
#define ERROR 0
typedef int SElemType;
typedef int Status;
/*栈的顺序表示法1*/
typedef struct
{
SElemType *base;
SElemType *top;
int stacksize;
} SqStackOne;
/*栈的顺序表示法2*/
typedef struct
{
SElemType data[STACK_INIT_SIZE];
int top;
} SqStackTwo;
/*链式栈的表示*/
typedef struct LinkNode
{
SElemType data;
struct LinkNode *next;
}*LiStack;
/*共享栈的实现*/
typedef struct
{
SElemType data[STACK_INIT_SIZE];
int top[2];//top为两个栈顶的指针
} Stk;
Status InitStack_one(SqStackOne &S);
Status GetTop_one(SqStackOne S,SElemType &e);
Status Push_one(SqStackOne &S,SElemType e);
Status Pop_one(SqStackOne &S,SElemType &e);
void InitStack_two(SqStackTwo &S);
Status GetTop_two(SqStackTwo S,SElemType &e);
Status Push_two(SqStackTwo &S,SElemType e);
Status Pop_two(SqStackTwo &S,SElemType &e);
//共享栈的压栈操作
Status Push_Stk(Stk S,int i,SElemType e);
//共享栈的压栈操作
Status Push_Stk(Stk S,int i,SElemType e);
int main()
{
SqStackOne s;
InitStack_one(s);
int d;
for(int i=0; i<5; i++)
Push_one(s,i);
for(int i=0; i<5; i++)
{
Pop_one(s,d);
printf("%d\n",d);
}
return 0;
}
Status InitStack_one(SqStackOne &S)
{
S.base = (SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!S.base)
return ERROR;
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
}//InitStack_one
void InitStack_two(SqStackTwo &S)
{
S.top = -1;
}//InitStack_two
Status GetTop_one(SqStackOne S,SElemType &e)
{
if(S.base == S.top)
return ERROR;
e = *--S.top;
return OK;
}
Status GetTop_two(SqStackTwo S,SElemType &e)
{
if(S.top == -1)
return ERROR;
e = S.data[S.top];
return OK;
}
Status Push_one(SqStackOne &S,SElemType e)
{
if(S.top -S.base>= S.stacksize)//栈满了
{
S.base = (SElemType*)realloc(S.base,(S.stacksize + STACKINCRMENT)*sizeof(SElemType));
if(!S.base)
return ERROR;
//因为base是新的地址
S.top = S.base + S.stacksize;//重新指定栈顶
S.stacksize +=STACKINCRMENT;
}
*S.top++ = e;
return OK;
}
Status Push_two(SqStackTwo &S,SElemType e)
{
if(S.top ==STACK_INIT_SIZE-1)//栈满了
return ERROR;
S.data[++S.top] = e;
return OK;
}
Status Pop_one(SqStackOne &S,SElemType &e)
{
if(S.top == S.base)
return ERROR;
e =*--S.top;//先减减
return OK;
}
Status Pop_two(SqStackTwo &S,SElemType &e)
{
if(S.top == -1)//栈为空
return ERROR;
e = S.data[S.top--];
return OK;
}
//共享栈的压栈操作
Status Push_Stk(Stk S,int i,SElemType e)
{
if(i<0||i>1)
{
printf("栈号不对\n");
return ERROR;
}
if(S.top[1]-S.top[0] == 1)
{
printf("栈已满\n");
return ERROR;
}
switch(i)
{
case 0:
S.data[++S.top[0]] = e;
return 1;
case 1:
S.data[--S.top[1]] = e;
return 1;
}
}//end Push_stk
//共享栈的弹栈操作
Status Pop_Stk(Stk S,int i,SElemType &e)
{
if(i<0||i>1)
{
printf("栈号不对\n");
return ERROR;
}
switch(i)
{
case 0:
if(S.top[0] == -1)
{
printf("栈为空\n");
return ERROR;
}
e = S.data[S.top[0]--];
case 1:
if(S.top[1] == STACK_INIT_SIZE)
{
printf("栈为空\n");
return ERROR;
}
e = S.data[S.top[1]++];
}
}//end Pop_Stk