您的位置:首页 > 其它

栈的链式实现

2015-10-16 21:51 316 查看
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef int Elemtype;
typedef struct StackNode{
Elemtype data;
struct StackNode *next;
}StackNode;
typedef struct{
struct StackNode *top;//栈顶指针,必须有 struct 才可以

}LinkStack;
/*初始化链栈*/
void InitStack(LinkStack *s)
{
s->top=NULL;
printf("\n已经成功初始化链栈!\n");

}

/*链栈置空*/
void setEmpty(LinkStack *s)
{
s->top=NULL;
printf("\n链栈已经置空!\n");

}
void pushLstack(LinkStack *s,Elemtype x)
{
StackNode *p;
p=(StackNode *)malloc(sizeof(StackNode));//建立结点
p->data=x;
p->next=s->top;
s->top=p;

}
Elemtype popLstack(LinkStack *s)
{
Elemtype x;
StackNode *p;
p=s->top;
if(s->top==0)
{
printf("\n栈空,不能出栈!\n");
return 0;
}
x=p->data; printf("\n当前数据为:%d\n",x);
s->top=p->next;//当前的栈顶指向原栈的next
free(p);
return x;

}
Elemtype StackTop(LinkStack *s)
{
Elemtype x;
if(s->top==0)
{
printf("\n链栈空\n");
return 0;
}
{
x=s->top->data;printf("\n\n当前链栈的栈顶元素为:%d\n",x); return x;
}
}
/*遍历*/
void Disp(LinkStack *s)
{
printf("\n链栈中的数据为:\n");
printf("==================================\n");
StackNode *p;
p=s->top;
while(p!=NULL)
{
printf("%d\n",p->data);
p=p->next;
}
printf("===================================\n");
}
void main()
{
int i,n,a;//int m;
LinkStack *s;
s=(LinkStack *)malloc(sizeof(LinkStack));
int cord;
printf("第一次使用必须初始化!\n");
do
{
printf("\n");
printf("\n");
printf("\n=============主菜单============\n");
printf("\n       1  初始化链表           \n");
printf("\n       2  入栈                 \n");
printf("\n       3  出栈                 \n");
printf("\n       4  取栈顶元素           \n");
printf("\n       5  置空链栈             \n");
printf("\n       6  结束 程序            \n");
printf("\n===============================\n");
printf("请你输入您的选择(1,2,3,4,5,6)");
scanf("%d",&cord);
printf("\n");
switch(cord)
{
case 1:{
InitStack(s);
Disp(s);}break;
case 2:{
printf("输入将要压入链栈的数据个数:n=");
scanf("%d",&n);
printf("依次将%d个数据压入链栈:\n",n);
for(i=1;i<=n;i++)
{ scanf("%d",&a);
pushLstack(s,a);
}
Disp(s);
}break;
case 3:{
//printf("\n出栈操作开始!\n");
//printf("输入将要出栈的数据个数:m=");
//scanf("%d",&m);
// for(i=1;i<=m;i++)
// {
//  printf("\n\n第%d次出栈的数据是:%d",i,popLstack(s));
// }
popLstack(s); Disp(s);
}break;
case 4:{
//printf("\n\n链栈的栈顶元素为:%d\n",StackTop(s));
StackTop(s);printf("\n");
}break;
case 5:{
setEmpty(s);
Disp(s);
}break;
case 6:exit(0);
}
}while(cord<=6);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: