建立数据元素为字符型的顺序栈(C语言版)

时间:2021-04-22 10:22:59
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<time.h>
#include<stdlib.h>
#define ElemType char
#define INIT_SIZE 100//即栈的最大长度,以元素为单位
#define INCREMENT 10//存储分配增量

//顺序栈的数据结构
typedef struct SNode
{
ElemType *base;//在构造之前和销毁之后,base的值为NULL
ElemType *top;//栈顶指针
int stacksize;//当前栈中已有的元素个数
}SqStack;

int InitStack(SqStack &S)
{//构造一个空栈
S.base=(ElemType *)malloc(INIT_SIZE*sizeof(ElemType));
if(S.base == NULL)
{//存储分配失败
printf("内存分配失败!\n\n");return -1;
}
S.top=S.base;
S.stacksize=INIT_SIZE;//初始时栈中没有元素
return 1;
}

void Assignment(SqStack &S)//将表 L 赋值为随机字符串,最小长度为3,最大长度为16
{
int i,p,flag,k=0;
char str[16]={NULL};
srand((unsigned)time(NULL));
p=rand()%12;
for(i=0;i<3+p;i++)//栈中的各个数据元素为随机生成的字母
{//此栈的最小长度为3,可变长部分由随机数p的值来确定
flag=rand()%2;
if(flag)S.base[i]='A'+rand()%26;
else S.base[i]='a'+rand()%26;
S.top++;//每个字母入栈时,栈顶都要自增1
}
S.base[i]='\0';//此栈的实现借助字符数组,即相当于字符串,故结尾要加结束符
}

int DestroyStack(SqStack &S)//销毁栈
{
S.stacksize=0;
free(S.base);
S.top=S.base=NULL;
return 1;
}

int ClearStack(SqStack &S)//将栈置空
{
S.top=S.base;
return 1;
}

int DisplayStack(SqStack S)//打印栈中的数据
{
if(S.base == NULL)
{
printf("栈已被销毁!\n\n");return -1;
}
int len=S.top - S.base;
if(len <= 0)
{
printf("当前栈已空!\n\n");return 0;
}
int k;
printf("当前栈的数据为:\n");
for(k=0;k<len -1;k++)
{
printf("%c - ",S.base[k]);
}
printf("%c\n",S.base[k]);
return 1;
}

int GetTop(SqStack S)//查询栈顶数据元素值
{
ElemType e=*(S.top-1);
printf("当前栈的栈顶为:%c\n\n",e);
return 1;
}

int Push(SqStack &S)//入栈操作
{
if(S.top - S.base >= S.stacksize)
{//栈满时,追加存储空间
S.base=(ElemType *)realloc(S.base,(INIT_SIZE+INCREMENT)*sizeof(ElemType));
if(S.base == NULL)
{//追加内存失败
printf("追加内存分配失败!\n\n");return -1;
}
S.top=S.base + S.stacksize;
S.stacksize+=INCREMENT;
}
ElemType e;
printf("请输入你要插入的字符:\n\n");
scanf("%c",&e);
*S.top++=e;//栈顶赋值为输入的元素形成新栈顶
return 1;
}

int Pop(SqStack &S)//出栈操作
{
if(S.base == S.top)
{
printf("当前栈已空!\n\n");return -1;
}
ElemType e=*(S.top-1);
*S.top--;//栈顶指针下移一位
printf("栈顶 %c 被删除!\n\n",e);
return 1;
}

int main()
{
SqStack S;
InitStack(S);
Assignment(S);
DisplayStack(S);
GetTop(S);
// Push(S);
Pop(S);
DisplayStack(S);
GetTop(S);
return 1;
}