数据结构里面都学过的,栈的结构体建立。将栈的基本操作函数单独编写成头文件,在之后使用时便可直接调用头文件,不必再在函数内编写。同时也编写了对各项功能检验的主函数代码,有需要的转走记得点赞加关注噢。
文件头及结构体定义
#include<stdio.h>
#include<stdlib.h>
using namespace std;
#define STACK_INIT_SIZE 100 //存储空间初始分配量
#define STACKINCREMENT 10 //存储空间分配增量
#define OVERFLOW -1
#define OK 1
#define ERROR 0
typedef char SElemtype;
typedef int Status;
typedef struct
{
SElemtype *base; //栈底指针,在栈构造之前和销毁之后,base的值为NULL
SElemtype *top; //栈顶指针
int stacksize; //栈的容量,即当前已分配的存储空间
}SqStack;
栈的初始化
Status InitStack(SqStack *S)
{
(*S).base=(SElemtype *)malloc(STACK_INIT_SIZE *sizeof(SElemtype)); //分配存储空间
if(!(*S).base) exit(OVERFLOW); //存储分配失败
(*S).top=(*S).base; //当为空栈时,栈顶和栈底相同
(*S).stacksize=STACK_INIT_SIZE; //将栈的容量设置为初始分配容量
return OK;
}
销毁栈
Status DestroyStack(SqStack *S)
{
free((*S).base); //释放栈的存储空间
(*S).base=(*S).top=NULL; //栈顶和栈底均为空
(*S).stacksize=0; //栈的容量为0
return OK;
}
清空栈
Status ClearStack(SqStack *S)
{
(*S).top=(*S).base; //栈顶等于栈底,且栈的容量为0
(*S).stacksize=0;
return 0;
}
判断栈是否为空
Status StackEmpty(SqStack S)
{
if(S.base==S.top) //若栈顶与栈底相同,则说明栈为空,则返回true,否则返回false
return true;
else
return false;
}
求栈的长度
int StackLength(SqStack S)
{
return S.top-S.base; //元素个数即栈的长度即为栈顶-栈底
}
取栈顶元素
Status GetTop(SqStack S,SElemtype &e)
{
if(S.top == S.base ) return ERROR;
e = *(S.top-1); //因为栈顶指针始终指向栈顶元素的下一个位置上,所以我们要让栈顶指针减一,并用e传回栈顶元素的值
return OK;
}
入栈
Status 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) exit(OVERFLOW); //存储分配失败
S.top = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;
}
*S.top++=e; //将元素插入至栈顶位置,且栈顶+1,指向下一位置
return OK;
}
出栈
Status Pop(SqStack &S,SElemtype &e)
{
if(S.top == S.base) return ERROR;
e=*(--S.top); //将栈顶元素取出,且栈顶-1
return OK;
}
输出栈内元素
Status StackTraverse(SqStack S)
{
SElemtype *p;
p=S.base; //依次从栈底开始,将栈内元素逐一调用输出,栈的位置逐渐+1,直至栈顶
while(p!=S.top)
{
printf("%d ",*p);
p++;
}
printf("\n");
return OK;
}
当此头文件编写成功后,需要验证这些基本操作函数是否能完成功能,完整的功能验证代码如下,
其中使用swith语句可以实现用户交互界面的功能选择表,更加美观。
#include<stdio.h>
#include<stdlib.h>
#include"SqStack.h"
using namespace std;
int main()
{
int i,x;
SqStack S;
SElemtype e; //入栈的元素
SElemtype m; //出栈的元素
SElemtype topelem; //栈顶元素
while(true)
{
printf(" 1.初始化栈\n");
printf(" 2.销毁栈\n");
printf(" 3.清空栈\n");
printf(" 4.栈判空\n");
printf(" 5.求栈长度\n");
printf(" 6.获取栈顶元素\n");
printf(" 7.插入一个 元素\n");
printf(" 8.删除一个元素\n");
printf(" 9.输出所有元素\n");
printf("请输入数字(输入负数退出):\n");
scanf("%d",&i);
if(i<0)
break;
if(i>0&&i<10)
{
switch(i)
{
case 1:
InitStack(&S);
if(InitStack(&S))
{
printf("初始化成功\n");
}else
{
printf("初始化失败\n");
}
system("pause");
break;
case 2:
if(DestroyStack(&S))
{
printf("销毁成功\n");
}
system("pause");
break;
case 3:
if(!StackEmpty(S))
{
ClearStack(&S);
if(StackEmpty(S))
{printf("栈已清空\n");}
else
{
printf("栈为情况");
}
}
else
{
printf("栈不存在\n");
}
system("pause");
break;
case 4:
if(StackEmpty(S))
{
printf("栈空\n");
}else
{
printf("栈不空\n");
}
system("pause");
break;
case 5:
if(!StackEmpty(S))
{
printf("栈中有%d个元素\n",StackLength(S));
}else if(StackEmpty(S))
{
printf("栈中没有元素\n");
}else
{
printf("栈不存在\n");
}
system("pause");
break;
case 6:
if(!StackEmpty(S))
{
GetTop(S,topelem);
printf("栈顶元素为%d\n",topelem);
}else if(StackEmpty(S))
{
printf("栈中没有元素\n");
}else
{
printf("栈不存在\n");
}
system("pause");
break;
case 7:
printf("请输入你所要插入的元素\n");
scanf("%d",&e);
Push(S,e);
system("pause");
break;
case 8:
if(!StackEmpty(S))
{
Pop(S,m);
printf("你删除的元素是%d\n",m);
}else if(StackEmpty(S))
{
printf("栈中没有元素\n");
}else
{
printf("栈不存在\n");
}
system("pause");
break;
case 9:
if(!StackEmpty(S))
{
StackTraverse(S);
}else if(StackEmpty(S))
{
printf("栈中没有元素\n");
}else
{
printf("栈不存在\n");
}
system("pause");
break;
}
}else
{
printf("没有这个选项\n");
}
system("cls");
}
}