《数据结构与算法的问题与实验》例子
#include<stdio.h>
#include<malloc.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef char ElemType;
typedef struct SNode
{
ElemType *top; //栈顶指针
ElemType *bottom;//栈底指针
int stackSize; //顺序栈的最大长度
}Stack;
//初始化栈
void InitStack(Stack *s)
{
s->bottom = (ElemType *)malloc(sizeof(ElemType)*STACK_INIT_SIZE);
if(s->bottom==NULL)
{
printf("初始化栈时,申请空间失败。");
return;
}
s->top = s->bottom;
s->stackSize = STACK_INIT_SIZE;
}
//清空栈
void ClearStack(Stack *s)
{
free(s->top);
free(s->bottom);
}
//判断栈是否为空,栈为空的话返回1;栈不空的话返回0;
int EmptyStack(Stack* s)
{
if(s->top == s->bottom)
{
//printf("经过EmptyStack函数判定,本栈为空。\n");
return 1;
}
return 0;
}
//入栈
void Push(Stack* s,ElemType e)
{
//如果栈满,追加空间。
if(s->top - s->bottom == s->stackSize)
{
s->bottom = (ElemType *)realloc(s->bottom,sizeof(ElemType)*(s->stackSize + STACKINCREMENT));
//如果追加空间失败
if(s->bottom==NULL)
{
printf("栈满时,追加空间失败。");
return;
}
//重新为栈顶指针赋值
s->top = s->bottom + s->stackSize;
//重新为栈的最大长度赋值
s->stackSize += STACKINCREMENT;
}
//取地址符
//先为栈顶元素赋值,再为栈顶指针加1.
*s->top = e;
s->top++;
}
//出栈
ElemType Pop(Stack* s)
{
if(EmptyStack(s)==1)
{
printf("栈空");
return 0;
}
ElemType data;
//因为入栈时是先入栈后++,所以出栈时先--再取元素;
s->top--;
data = *s->top;
return data;
}
//取栈顶元素
ElemType Top(Stack* s)
{
ElemType data;
if(s->top == s->bottom)
{
printf("在取栈顶元素的时候,发现栈为空");
return 0;
}
data = *(s->top-1);
return data;
}
//栈的长度
int StackLength(Stack* s)
{
return s->top - s->bottom;
}
void Output(Stack* s)
{
ElemType *temp = s->top;
if(EmptyStack(s)==0)
return;
do
{
temp--;
printf("%c",*temp);
}
while(temp > s->bottom);
}
int main()
{
ElemType ch,temp;
Stack* s;
s = (Stack *)malloc(sizeof(Stack));
printf("1-初始化栈\n");
InitStack(s);
printf("2-栈为:%s\n",(EmptyStack(s)?"空":"非空"));
printf("3-依次将'j','a','k','e'入栈\n");
Push(s,'j');
Push(s,'a');
Push(s,'k');
Push(s,'e');
printf("4-栈为:%s\n",(EmptyStack(s)?"空":"非空"));
printf("5-栈的长度为:%d\n",StackLength(s));
printf("6-取栈顶元素:");
ch = Top(s);
printf("e=%c\n",ch);
printf("7-从栈顶到栈底输出元素\n");
Output(s);
printf("\n");
printf("8-所有元素出栈\n");
while(!EmptyStack(s))
{
ch = Pop(s);
}
printf("9-栈为:%s\n",(EmptyStack(s)?"空":"非空"));
printf("10-释放栈\n");
ClearStack(s);
}