栈的链式存储结构的实现
1)编写完成下列功能的函数:(1)初始化一个栈;(2)在已经初始化的基础上,创建一个包含 5 个不大于 100 的正整数值的栈(5 个值由计算机随机产生);(3)将一个数 x 插在栈顶(x 在程序运行时输入);( 4)将栈顶元素弹出, 并在弹出结束后输出弹出元素的值;(5)求栈中元素的个数;(6)输出从栈顶到栈底的所有元素。
#define MAXSIZE 100
typedef struct StackNode{
SElemType data;
struct StackNode *next;
} StackNode, *LinkStack;
链栈是动态的分配内存空间,不需要判断栈空和栈满。但删除时,要释放空间。
创建就是将元素一个一个插入栈中,求栈长就是遍历栈。
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
#define MAXSIZE 100
#define ERROR 0
#define OK 1
typedef struct StackNode{
int data;
struct StackNode *next;
} StackNode, *LinkStack;
void InitStack(LinkStack &S);
int CreateStack(LinkStack &S);
int Push(LinkStack &S,int x);
int Pop(LinkStack &S,int &x);
int StackLength(LinkStack S);
int PrintStack(LinkStack S);
void InitStack(LinkStack &S)
{//初始化
S=NULL;
}
int CreateStack(LinkStack &S)
{//创建
int i,a;
printf("长度为:");
scanf("%d",&a);
srand((unsigned)time(NULL));
for(i = 0;i < a;i++ )
{
LinkStack p=(LinkStack )malloc(sizeof(StackNode));
if (!p)
return ERROR;
p->data = rand() % 100 +1;
p->next=S;
S=p;
}
return OK;
}
int Push(LinkStack &S,int x)
{//插入
LinkStack p=(LinkStack )malloc(sizeof(StackNode));
if (!p)
return ERROR;
p->data = x;
p->next=S;
S=p;
return OK;
}
int Pop(LinkStack &S,int &x)
{//出栈
LinkStack p = S;
x = p->data;
S = p->next ;
free(p);//释放
return OK;
}
int StackLength(LinkStack S)
{//栈长
int n = 0;
LinkStack p = S ;
while(p != NULL)
{
n++;
p = p->next ;
}
return n ;
}
int PrintStack(LinkStack S)
{//遍历
LinkStack p = S ;
while(p != NULL)
{
printf("%d ",p->data );
p = p->next ;
}
return OK;
}
int main()
{
int a,k,x,i,e;
LinkStack 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:
InitStack(S);
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;
}