栈的顺序存储结构的实现
1)编写完成下列功能的函数:(1)初始化一个栈;(2)在已经初始化的基础上,创建一个包含 5 个不大于 100 的正整数值的栈(5 个值由计算机随机产生);(3)将一个数 x 插在栈顶(x 在程序运行时输入);( 4)将栈顶元素弹出, 并在弹出结束后输出弹出元素的值;(5)求栈中元素的个数;(6)输出从栈顶到栈底的所有元素。
栈的顺序存储结构定义
#define MAXSIZE 100 // 存储空间初始分配量
typedef struct {
SElemType *base; //栈底指针
SElemType *top; // 栈顶指针
int stacksize; // 当前已分配的存储空间,以元素为单位
} SqStack;
顺序栈的插入和删除时,要判断栈空和栈满。
栈空:S.top = S.base;
栈满:S.top - S.base = S.stacksize
栈长:S.top - S.base
栈空时,S.top、S.base同时指向栈底。
入栈时,先将元素放到S,top所指的内存空间中,然后让S.top+1(上移)。
出栈时,栈顶元素为*(S.top-1),直接S.top-1(下移),即删除栈顶元素。
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
#define MAXSIZE 100
#define ERROR 0
#define OK 1
typedef struct{
int *base;
int *top;
int stacksize;
}SqStack;
int InitStack(SqStack &S);
void CreateStack(SqStack &L);
int Push(SqStack &S,int x);
int Pop(SqStack &S,int &x);
int StackLength(SqStack S);
int PrintStack(SqStack S);
int InitStack(SqStack &S)
{//初始化
S.base= (int*)malloc(MAXSIZE *sizeof(int));
if(!S.base)
return ERROR;
S.top = S.base;//栈空
S.stacksize= MAXSIZE;
return OK;
}
void CreateStack(SqStack &S)
{//创建
int i,a;
printf("栈的长度为:");
scanf("%d",&a);
srand((unsigned)time(NULL));
for(i = 0;i < a;i++ )
*S.top++= rand() % 100 +1;//相当于*S.top=rand() % 100 +1;S.top++;
}
int Push(SqStack &S,int x)
{//插入
if (S.top-S.base==S.stacksize)
return ERROR; //栈满
*S.top++ = x; //相当于*S.top=x;S.top++;
return OK;
}
int Pop(SqStack &S,int &x)
{//出
if(S.top==S.base)
return ERROR;
x = *--S.top;//相当于--S.top;x=*S,top;
return OK;
}
int StackLength(SqStack S)
{//栈长
return S.top - S.base ;
}
int PrintStack(SqStack S)
{//遍历
for(int i = 0;S.top - i != S.base;i++)//判断条件为栈不为空时
printf("%d ",*(S.top - 1 -i ));//遍历时,栈顶指针未变
return OK;
/*
也可以这样遍历
for(int i = 1;i <= S.top - S.base;i++)
printf("%d ",*(S.top - i));//遍历时,栈顶指针未变
return OK;
*/
}
int main()
{
int a,k,f,x,i,e;
SqStack S;
for(k = 0;;k++)
{
printf("\n1.初始化一个顺序栈\n");
printf("2.创建一个正整数的顺序栈\n");
printf("3.插入某个元素到栈顶\n");
printf("4.删除某个栈顶元素\n");
printf("5.求顺序栈长\n");
printf("6.遍历元素\n");
printf("7.退出程序\n");
printf("输入你的选择:\n");
scanf("%d",&a);
switch (a)
{
case 1:
f = InitStack(S);
if(f == 1)
printf("创建顺序栈成功!\n");
break;
case 2:
CreateStack(S);
PrintStack(S);
break;
case 3:
printf("你想插入的数为:");
scanf("%d",&x);
Push(S,x);
PrintStack(S);break;
case 4:
e = Pop(S,x);
printf("删除栈顶元素为:%d\n",e);
PrintStack(S);break;
case 5:
i = StackLength(S);
printf("栈长为:%d",i);break;
case 6:PrintStack(S);break;
case 7:exit(0);
}
}
return OK;
}