栈:在表尾进行插入和删除操作的线性表。栈又称后进先出LIFO的线性表。
#include <stdio.h>
#include <stdlib.h>
#define SElemType int
#define ERROR 0
#define OK 1
#define STACK_INIT_SIZE 100 //存储空间初始分配增量
#define STACKINCREMENT 10 //存储空间分配增量
/******栈的顺序存储实现******/
typedef struct
{
SElemType *base; //在栈构造之前和销毁之后,base的值为base
SElemType *top; //栈顶指针
int stacksize; //当前已分配的存储空间长度
}SqStack;
/**********构造栈***********/
int InitStack(SqStack &S)
{
//构造一个空栈S
S.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
if(!S.base) //存储分配失败
return ERROR;
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
return OK;
}
/*********返回栈顶元素*********/
int GetTop(SqStack S,SElemType &e)
{
//若栈不空,则用e返回栈顶元素,并返回OK,否则返回ERROR
if(S.top == S.base)
return ERROR;
e = *(S.top-1);
return OK;
}
/********插入元素为栈顶元素********/
int Push(SqStack &S,SElemType e)
{
if(S.top - S.base >= S.stacksize) //栈满,增加存储空间
{
S.base = (SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!S.base) //存储分配失败
return ERROR;
S.top = S.base + S.stacksize; //重新设置top指针
S.stacksize += STACKINCREMENT; //重新设置分配存储空间长度
}
*S.top = e; //插入元素
++S.top ;
return OK;
}
/************删除栈定元素************/
int Pop(SqStack &S,SElemType &e)
{
//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK,否则返回ERROR
if(S.top == S.base) //栈为空
return ERROR;
e = * --S.top; //返回栈定删除的元素
return OK;
}
/************输出栈内元素**************/
void PrintStack(SqStack &S)
{
printf("输出栈内元素\n");
int *p;
p = S.top - 1;
while(p != S.base)
{
printf("%d ",*p);
p--;
}
printf("%d\n\n",*p);
}
int main()
{
SqStack Stack;
int sum,num,i;
if(InitStack(Stack))
{
/**********插入功能实现模块*********/
printf("请输入插入元素个数:");
scanf("%d",&sum);
for(i = 1;i <= sum;i++)
{
printf("输入第%d个元素:",i);
scanf("%d",&num);
Push(Stack,num);
}
PrintStack(Stack); //输出栈内信息
/*********返回栈顶元素***********/
if(GetTop(Stack,num)) // 判断栈是否为空栈,如果为空栈,if条件不成立
{
printf("栈顶元素为:%d\n",num);
}else
{
printf("栈为空栈!\n");
}
/********插入栈顶元素***********/
printf("请输入插入栈顶元素的值:");
scanf("%d",&num);
if(Push(Stack,num))
{
PrintStack(Stack); //输出栈内信息
}else
{
printf("空间不足!");
}
/*******删除栈顶元素功能********/
Pop(Stack,num);
printf("删除的栈顶元素为:%d\n",num);
PrintStack(Stack); //输出栈内信息
}else
{
printf("构造栈失败!\n");
}
return 0;
}