一、学习内容
1、 顺序栈初始化
2、 顺序栈的入栈
3、 顺序栈的出栈
4、 顺序栈取栈顶
5、 顺序栈的清空
6、 顺序栈的销毁
7、 顺序栈的判空
8、 顺序栈的判满
9、所有元素出栈
10、求栈元素个数
二、总代码
/*
顺序栈:
栈的操作都在栈顶进行,特点是先进后出
*/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
typedef int StackEntry;
typedef enum status
{
success,fail
}Status;
typedef struct stack
{
int top;
int maxsize;
StackEntry *entry;//动态分配
}Stack,*StackPtr;
Status Stack_Init(StackPtr s,int size);
Status Stack_Push(StackPtr s,StackEntry item);
Status Stack_Pop(StackPtr s,StackEntry *item);
Status Stack_Top(StackPtr s,StackEntry *item);
bool Stack_Clear(StackPtr s);
Status Stack_Destroy(StackPtr s);
bool Stack_Empty(StackPtr s);
bool Stack_Full(StackPtr s);
void Stack_All(StackPtr s);
Status Stack_Check(Status sInit);
/*一、初始化*/
Status Stack_Init(StackPtr s,int size)
{
Status outcome=fail;
s->entry=(StackEntry *)malloc(size*sizeof(StackEntry));
if(s->entry!=NULL)
{
s->top=-1;//空栈
s->maxsize=size;
outcome=success;
}
return outcome;
}
/*二、入栈*/
Status Stack_Push(StackPtr s,StackEntry item)
{
Status outcome=success;
if(Stack_Full(s)==1)
{
outcome=fail;
}
else
{
s->top++;
s->entry[s->top]=item;
}
return outcome;
}
/*三、出栈*/
Status Stack_Pop(StackPtr s,StackEntry *item)
{
Status outcome=success;
if(Stack_Empty(s)==true)
{
outcome=fail;
}
else
{
*item=s->entry[s->top];
--s->top;
}
return outcome;
}
/*四、取栈顶元素*/
Status Stack_Top(StackPtr s,StackEntry *item)
{
Status outcome=success;
if(Stack_Empty(s)==1)
{
outcome=fail;
}
else
{
*item=s->entry[s->top];
}
return outcome;
}
/*五、清空*/
bool Stack_Clear(StackPtr s)
{
s->top=-1;
return true;
}
/*六、销毁*/
Status Stack_Destroy(StackPtr s)
{
Status outcome=fail;
if(s->entry!=NULL)
{
free(s->entry);
s->entry=NULL;
s->top=-1;
outcome=success;
}
return outcome;
}
/*七、判栈空*/
bool Stack_Empty(StackPtr s)
{
return (s->top<=-1);
}
/*八、判栈满*/
bool Stack_Full(StackPtr s)
{
return (s->top>=s->maxsize-1);//如果栈满则返回1
}
/*九、所有元素出栈*/
void Stack_All(StackPtr s)
{
int item,i;
if(Stack_Empty(s)==true)printf("栈下溢!\n");
else
{
printf("从栈顶依次向底的元素为:\n");
for(i=s->top;i>=0;i--)
{
Stack_Pop(s,&item);
printf("%d\n",item);
}
}
}
/*十、检查是否初始化*/
Status Stack_Check(Status sInit)
{
if(sInit==success)return success;
else return fail;
}
int main()
{
int number,i,n,size=0;
StackEntry item;
Status sInit=fail,sOther=fail;
Stack s;
printf("****************1、 顺序栈初始化\t");
printf("2、 顺序栈的入栈****************\n");
printf("****************3、 顺序栈的出栈\t");
printf("4、 顺序栈取栈顶****************\n");
printf("****************5、 顺序栈的清空\t");
printf("6、 顺序栈的销毁****************\n");
printf("****************7、 顺序栈的判空\t");
printf("8、 顺序栈的判满****************\n");
printf("****************9、 展示菜单选项\t");
printf("10、所有元素出栈****************\n");
printf("****************11、栈元素的个数\t");
printf("0、 结束该程序******************\n");
while(1)
{
printf("选项:");
scanf("%d",&number);
switch(number)
{
case 1: {
printf("请输入栈顶最大元素个数:");
scanf("%d",&size);
sInit=Stack_Init(&s,size);
if(sInit==success) printf("初始化成功!\n");
else if(sInit==fail)printf("初始化失败!\n");
break;
}
case 2: {
if(Stack_Check(sInit)==fail)printf("请先初始化再进行其他操作!\n");
else
{
printf("请输入入栈元素:");
scanf("%d",&item);
sOther=Stack_Push(&s,item);
if(sOther==success)printf("入栈成功!\n");
else printf("栈上溢!\n");
}
break;
}
case 3 :{
if(Stack_Check(sInit)==fail)printf("请先初始化再进行其他操作!\n");
else
{
sOther=Stack_Pop(&s,&item);
if(sOther==success)printf("出栈元素为:%d\n",item);
else printf("栈下溢!\n");
}
break;
}
case 4 :{
if(Stack_Check(sInit)==fail)printf("请先初始化再进行其他操作!\n");
else
{
sOther=Stack_Top(&s,&item);
if(sOther==success)printf("栈顶元素为:%d\n",item);
else printf("栈下溢!\n");
}
break;
}
case 5 :{
if(Stack_Check(sInit)==fail)printf("请先初始化再进行其他操作!\n");
else
{
if(Stack_Clear(&s)==true)printf("清空成功!\n");
else printf("清空失败!\n");
}
break;
}
case 6 :{
if(Stack_Check(sInit)==fail)printf("请先初始化再进行其他操作!\n");
else
{
sOther=Stack_Destroy(&s);
if(sOther==success)
{
printf("销毁成功!\n");
sInit=fail;
}
else printf("销毁失败!\n");
}
break;
}
case 7 :{
if(Stack_Check(sInit)==fail)printf("请先初始化再进行其他操作!\n");
else
{
if(Stack_Empty(&s)==1)printf("栈空!\n");
else printf("栈未空!\n");
}
break;
}
case 8 :{
if(Stack_Check(sInit)==fail)printf("请先初始化再进行其他操作!\n");
else
{
if(Stack_Full(&s)==1)printf("栈满!\n");
else printf("栈未满!\n");
}
break;
}
case 9 :{
printf("------------------------------------------------------------------------\n");
printf("****************1、 顺序栈初始化\t");
printf("2、 顺序栈的入栈****************\n");
printf("****************3、 顺序栈的出栈\t");
printf("4、 顺序栈取栈顶****************\n");
printf("****************5、 顺序栈的清空\t");
printf("6、 顺序栈的销毁****************\n");
printf("****************7、 顺序栈的判空\t");
printf("8、 顺序栈的判满****************\n");
printf("****************9、 展示菜单选项\t");
printf("10、所有元素出栈****************\n");
printf("****************11、栈元素的个数\t");
printf("0、 结束该程序******************\n");
printf("------------------------------------------------------------------------\n");
break;
}
case 10:{
if(Stack_Check(sInit)==fail)printf("请先初始化再进行其他操作!\n");
else
{
Stack_All(&s);
}
break;
}
case 11:{
printf("栈元素个数:%d\n",s.maxsize);
break;
}
case 0 :{
printf("再见,祝您生活幸福愉快!");
return 0;
}
default:{
printf("请输入0~11内的整数!\n");
break;
}
}
}
}
/*
检查语句:
if(Stack_Check(sInit)==fail)printf("请先初始化再进行其他操作!\n");
else
{
}
*/