栈的出栈与入栈如图:
链栈定义:
typedef struct
{
int id;
char password[300];
}Elemtype;
typedef struct
{
Elemtype data;//*数据域
struct StackNode *next;.//*指针域
}StackNode,*LinkStack;//*指向StackNode
初始化:
void InitStack(LinkStack *a)
{
*a=NULL;//*将结点置空
}
入栈:
入栈就是在栈顶插入新元素
void Pop(LinkStack *a,Elemtype b)
{
LinkStack c;
c=(StackNode*)malloc(sizeof(StackNode));//*为新结点分配内存
c->data=b;//*将b赋值给新结点的数据域
c->next=*a;//*将新结点插入站定
*a=c;//*修改栈顶指针为c
printf("入栈成功!\n");//*提示入栈成功!
}
出栈:
出栈就是在栈顶删除新元素
void GetTop(LinkStack *a)
{
if(!(*a))//*如果链栈为空
{
printf("链栈空!\n");
return;
}
LinkStack b;
b=*a;//*保存旧链栈
*a=(*a)->next;//*修改栈顶指针
free(b);//*释放旧链栈空间
printf("出栈成功!\n");//*显示出栈成功!
}
取栈顶元素:
void PutsStack(LinkStack *a)
{
if(!(*a))//*如果链栈为空
{
printf("无信息\n");
return;
}
printf("id:%d\tpassword:%s\n",(*a)->data.id,(*a)->data.password);//*显示栈顶信息
}
完整代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct
{
int id;
char password[300];
}Elemtype;
typedef struct
{
Elemtype data;
struct StackNode *next;
}StackNode,*LinkStack;
void InitStack(LinkStack *a)
{
*a=NULL;
}
void Push(LinkStack *a,Elemtype c)
{
LinkStack b;
b=(StackNode*)malloc(sizeof(StackNode));
b->data=c;
b->next=*a;
*a=b;
}
void Windows_system()
{
LinkStack *a;
InitStack(&a);
for(;;)
{
printf("1.入栈\n2.出栈\n3.取栈顶元素\n4.退出\n");
char b[300];
for(;;)
{
gets(b);
if((strcmp(b,"1")==0)||(strcmp(b,"2")==0)||(strcmp(b,"3")==0)||(strcmp(b,"4")==0))
{
break;
}
else if(strlen(b)==0)
{
printf("内容不能为空!");
}
else
{
printf("输入错误!");
}
printf("请重新输入,重新输入的内容为:");
}
if(strcmp(b,"1")==0)
{
Elemtype c;
GetsStack(&c);
Pop(&a,c);
}
if(strcmp(b,"2")==0)
{
GetTop(&a);
}
if(strcmp(b,"3")==0)
{
PutsStack(&a);
}
if(strcmp(b,"4")==0)
{
return;
}
system("pause");
}
}
void Windows_name_system()
{
char a[]="Math Dash的链栈程序";
char b[strlen(a)+6];
sprintf(b,"title %s",a);
system(b);
puts(a);
}
void PutsStack(LinkStack *a)
{
if(!(*a))
{
printf("无信息\n");
return;
}
printf("id:%d\tpassword:%s\n",(*a)->data.id,(*a)->data.password);
}
void GetsStack(Elemtype *a)
{
char b[300],c[300];
printf("请输入id\n");
for(;;)
{
gets(b);
int d,e;
d=strlen(b);
for(e=0;e<strlen(b);e++)
{
if((!isdigit(b[e]))||(strlen(b)>6))
{
break;
}
}
if(e<d)
{
printf("输入错误!");
}
else if(strlen(b)==0)
{
printf("内容不能为空!");
}
else
{
break;
}
}
printf("请输入password\n");
for(;;)
{
gets(c);
if(strlen(c)==0)
{
printf("内容不能为空!");
}
else if(strlen(c)>20)
{
printf("密码长度过长!");
}
else
{
break;
}
printf("请重新输入,重新输入的内容为:");
}
a->id=atoi(b);
strcpy(a->password,c);
}
void Pop(LinkStack *a,Elemtype b)
{
LinkStack c;
c=(StackNode*)malloc(sizeof(StackNode));
c->data=b;
c->next=*a;
*a=c;
printf("入栈成功!\n");
}
void GetTop(LinkStack *a)
{
if(!(*a))
{
printf("链栈空!\n");
return;
}
LinkStack b;
b=*a;
*a=(*a)->next;
free(b);
printf("出栈成功!\n");
}
void f()
{
long a;
a=time(NULL);
Windows_name_system();
Windows_system();
long b;
b=time(NULL);
printf("用时:%ld天%ld时%ld分%ld秒\n",(b-a)/(3600*24),((b-a)/3600)%24,((b-a)/60)%60,(b-a)%60);
system("pause");
}
main()
{
f();
return 0;
}
程序运行结果如下: