栈是限定仅在表尾进行插入或删除操作的线性表,表尾为栈顶,表头为栈底
顺序栈的定义如下:
typedef struct
{
int id;
char password[300];
}SElemtype;
struct SqStack
{
SElemtype *data;
int stacksize,length;
};
最大值:
#define MAXSIZE 500
1.初始化
struct SqStack *InItStack()
{
struct SqStack *a;//*创建顺序栈
a=(struct SqStack*)malloc(sizeof(struct SqStack));
a->data=(SElemtype*)malloc(0);//*空顺序栈的内存为0
a->length=0;//*长度为0
a->stacksize=MAXSIZE;//*设为最大长度
if(!a)//*如果初始化失败!
{
printf("栈初始化失败!\n");
}
return a;//*返回空顺序栈
}
2.入栈
void Push(struct SqStack *a,SElemtype e)
{
if(a->length==a->stacksize)//*如果栈满
{
printf("栈满!\n");
return;
}
a->data[a->length]=e;//*入栈
a->length=a->length+1;
printf("入栈成功!\n");
}
3.出栈
void Pop(struct SqStack *a,SElemtype op)
{
if(a->length==0)//*如果数据元素为0
{
printf("出栈失败!\n");
return;
}
a->data[a->length-1]=op;//*op表示空结点
a->length--;//*节点数量增加
printf("出栈成功!\n");
}
4.取栈顶元素
void PutsStack(struct SqStack *a)
{
if(a->length==0)//*如果结点数量为0
{
printf("无信息\n");
}
else
{
printf("id:%d\tpassword:%s\n",a->data[a->length-1].id,a->data[a->length-1].password);//*显示栈顶数据
}
}
完整代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAXSIZE 500
typedef struct
{
int id;
char password[300];
}SElemtype;
struct SqStack
{
SElemtype *data;
int stacksize,length;
};
struct SqStack *InItStack()
{
struct SqStack *a;
a=(struct SqStack*)malloc(sizeof(struct SqStack));
a->data=(SElemtype*)malloc(0);
a->length=0;
a->stacksize=MAXSIZE;
if(!a)
{
printf("栈初始化失败!\n");
}
return a;
}
void Push(struct SqStack *a,SElemtype e)
{
if(a->length==a->stacksize)
{
printf("栈满!\n");
return;
}
a->data[a->length]=e;
a->length=a->length+1;
printf("入栈成功!\n");
}
struct SqStack *GetsStack()
{
SElemtype *e;
e=(SElemtype*)malloc(sizeof(SElemtype));
char a[300],b[300];
printf("请输入id:");
for(;;)
{
gets(a);
int c;
for(c=0;(c<strlen(a))&&(isdigit(a[c]))&&(strlen(a)<=20);c++);
if(c!=strlen(a))
{
printf("输入错误!");
}
else if(strlen(a)==0)
{
printf("内容不能为空!");
}
else
{
break;
}
printf("请重新输入,重新输入的内容为:");
}
printf("请输入密码:");
for(;;)
{
gets(b);
if(strlen(b)==0)
{
printf("内容不能为空!");
}
else if(strlen(b)>20)
{
printf("内容过长!");
}
else
{
break;
}
printf("请重新输入,重新输入的内容为:");
}
e->id=atoi(a);
strcpy(e->password,b);
return e;
}
void Windows_system()
{
struct SqStack *a;
SElemtype op;
a=InItStack();
if(!a)
{
return;
}
for(;;)
{
printf("1.入栈\n2.出栈\n3.取栈顶元素\n4.退出\n");
char b[10000];
for(;;)
{
gets(b);
if((strcmp(b,"1")==0)||(strcmp(b,"3")==0)||(strcmp(b,"2")==0)||(strcmp(b,"4")==0))
{
break;
}
else if(strlen(b)==0)
{
printf("内容不能为空,");
}
else
{
printf("输入错误,");
}
printf("请重新输入,重新输入的内容为:");
}
if(strcmp(b,"1")==0)
{
op=a->data[a->length];
SElemtype *c;
c=GetsStack();
Push(&(*a),*c);
}
if(strcmp(b,"2")==0)
{
Pop(&(*a),op);
}
if(strcmp(b,"3")==0)
{
PutsStack(&(*a));
}
if(strcmp(b,"4")==0)
{
return;
}
system("pause");
}
}
void PutsStack(struct SqStack *a)
{
if(a->length==0)
{
printf("无信息\n");
}
else
{
printf("id:%d\tpassword:%s\n",a->data[a->length-1].id,a->data[a->length-1].password);
}
}
void Pop(struct SqStack *a,SElemtype op)
{
if(a->length==0)
{
printf("出栈失败!\n");
return;
}
a->data[a->length-1]=op;
a->length--;
printf("出栈成功!\n");
}
void Windows_name_system()
{
char a[]="Math Dash的栈程序";
char b[strlen(a)+6];
sprintf(b,"title %s",a);
system(b);
puts(a);
}
void f()
{
Windows_name_system();
Windows_system();
system("pause");
}
main()
{
f();
return 0;
}
程序运行结果如下: