#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 10
typedef int ElemType;
typedef struct{
ElemType data[MAXSIZE];
int top;//栈顶指针,-1表示空栈,maxsize-1表示满栈
}SeqStack,*PSeqStack;
// 顺序栈SS的初始化操作。
void InitStack(PSeqStack SS);
// 销毁顺序栈SS。
void DestroyStack(PSeqStack SS);
// 元素入栈,返回值:0-失败;1-成功。
int Push(PSeqStack SS, ElemType *ee);
// 元素出栈,返回值:0-失败;1-成功。
int Pop(PSeqStack SS, ElemType *ee);
// 求顺序栈的长度,返回值:栈SS中元素的个数。0空,-1失败
int Length(PSeqStack SS);
// 清空顺序栈。
void Clear(PSeqStack SS);
// 判断顺序栈是否为空,返回值:1-非空,0-空,-1失败。
int IsEmpty(PSeqStack SS);
// 判断顺序栈是否已满,返回值:1-已满,0-未满或失败。
int IsFull(PSeqStack SS);
// 打印顺序栈中全部的元素。
void PrintStack(PSeqStack SS);
// 获取栈顶元素,返回值:0-失败;1-成功。
// 只查看栈顶元素的值,元素不出栈。
int GetTop(PSeqStack SS, ElemType *ee);
int main()
{
SeqStack SS;
InitStack(&SS);
printf("栈的长度是%d\n",Length(&SS));
ElemType ee; // 创建一个数据元素。
printf("元素(1、2、3、4、5、6、7、8、9、10)入栈。\n");
ee=1; Push(&SS, &ee);
ee=2; Push(&SS, &ee);
ee=3; Push(&SS, &ee);
ee=4; Push(&SS, &ee);
ee=5; Push(&SS, &ee);
ee=6; Push(&SS, &ee);
ee=7; Push(&SS, &ee);
ee=8; Push(&SS, &ee);
ee=9; Push(&SS, &ee);
ee=10; Push(&SS, &ee);
printf("栈的长度是%d\n",Length(&SS));
// 只查看栈顶元素的值,元素不出栈。
if (GetTop(&SS,&ee)==1) printf("栈顶的元素值为%d\n",ee);
PrintStack(&SS);
if (Pop(&SS,&ee)==1) printf("出栈的元素值为%d\n",ee);
if (Pop(&SS,&ee)==1) printf("出栈的元素值为%d\n",ee);
if (Pop(&SS,&ee)==1) printf("出栈的元素值为%d\n",ee);
if (Pop(&SS,&ee)==1) printf("出栈的元素值为%d\n",ee);
if (Pop(&SS,&ee)==1) printf("出栈的元素值为%d\n",ee);
if (Pop(&SS,&ee)==1) printf("出栈的元素值为%d\n",ee);
if (Pop(&SS,&ee)==1) printf("出栈的元素值为%d\n",ee);
if (Pop(&SS,&ee)==1) printf("出栈的元素值为%d\n",ee);
if (Pop(&SS,&ee)==1) printf("出栈的元素值为%d\n",ee);
if (Pop(&SS,&ee)==1) printf("出栈的元素值为%d\n",ee);
if (Pop(&SS,&ee)==1) printf("出栈的元素值为%d\n",ee);
if (Pop(&SS,&ee)==1) printf("出栈的元素值为%d\n",ee);
return 0;
}
void InitStack(PSeqStack SS)
{
Clear(SS);
}
void Clear(PSeqStack SS)
{
if(SS==NULL)
{
return;
}
SS->top=-1;
memset(SS->data,0,sizeof(ElemType)*MAXSIZE);
}
int Length(PSeqStack SS)
{
if(SS==NULL)
{
return -1;
}
return SS->top+1;
}
void DestroyStack(PSeqStack SS)
{
Clear(SS);
}
int IsEmpty(PSeqStack SS)
{
if(SS==NULL)
return -1;
if(SS->top==-1)
return 0;
else return 1;
}
int IsFull(PSeqStack SS)
{
if(SS==NULL) return -1;
if(SS->top==MAXSIZE-1) return 1;
else return 0;
}
int Push(PSeqStack SS,ElemType *ee)
{
if(SS==NULL)
return 0;
if(IsFull(SS)==1)
return 0;
memcpy(&SS->data[SS->top+1],ee,sizeof(ElemType));
SS->top++;
return 1;
}
void PrintStack(PSeqStack SS)
{
if(SS==NULL)
{
return;
}
if(SS->top==-1)
{
printf("栈为空\n");
return;
}
printf("从栈顶到栈底依次为:\n");
int kk=0;
for(kk=SS->top;kk>-1;kk--)
{
printf("%d\n",SS->data[kk]);
}
}
int Pop(PSeqStack SS,ElemType *ee)
{
if(SS==NULL)
return -1;
if(SS->top==-1)
{
printf("栈为空不能再出栈\n");
return 0;
}
SS->top--;
memcpy(ee,&SS->data[SS->top+1],sizeof(ElemType));
return 1;
}
int GetTop(PSeqStack SS, ElemType *ee)
{
if ( (SS == NULL) || (ee == NULL) ) return 0; // 检查空指针。
if (IsEmpty(SS) == 0) { printf("栈为空。\n"); return 0; }
memcpy(ee,&SS->data[SS->top],sizeof(ElemType)); // 用数组的下标访问。
// memcpy(ee,SS->data+SS->top,sizeof(ElemType)); // 采用指针运算也可以。
return 1;
}
数据结构 顺序栈
最新推荐文章于 2023-03-18 16:20:38 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)