要求说明:用栈设置一个密码,当输入错误时,系统提示密码错误,输入错误三次退出。输入正确密码后显示密码正确。程序密码为“13579”
//用栈设置密码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define STACK_SIZE 100 //设定栈空间最多100个元素
char PASSWORD[10] = "13579"; //设置正确密码
typedef char DataType; //假定栈元素数据类型为字符型
typedef struct //声明结构体类型
{
DataType *base;
DataType *top;
int stacksize;
int length;
}SeqStack;
void Initial(SeqStack *s) //初始化,构造栈
{
s -> base = (DataType *)malloc (STACK_SIZE*sizeof(DataType));
if(!s->base)
exit(-1);
s -> top = s -> base;
s -> stacksize = STACK_SIZE;
s -> length = 0;
}
int IsEmpty(SeqStack *S) //判空
{
return S -> top == S -> base;
}
int IsFull(SeqStack *S) //判满
{
return S -> top - S->base == STACK_SIZE -1;
}
void Push(SeqStack *S,DataType x) //进栈
{
if(IsFull(S))
{
printf("栈上溢\n");
exit(1);
}
*(S -> top ++) = x ;
++S->length;
// printf("%c",*S->top);
}
DataType pop(SeqStack *S) //出栈
{
if(IsEmpty(S))
{
printf("栈为空\n");
exit(1);
}
--(S->length);
return *--S -> top;
}
DataType GetTop(SeqStack *S,DataType *e) //取栈顶元素
{
if(IsEmpty(S))
{
printf("栈为空\n");
exit(1);
}
*e = *(S->top-1);
S->top --;
}
void change(SeqStack *s,char *a) //出栈顺序取栈顶元素
{
int n = s -> length - 1;
while(!IsEmpty(s))
{
GetTop(s,&a[n--]);
}
}
void clearstack(SeqStack *s) //清空栈
{
s -> top = s -> base;
s -> length = 0;
}
void PwdSet(SeqStack *s) //子函数用于判断用户密码是否正确
{
int i =0,k,j =0;
DataType ch,*a;
k = strlen(PASSWORD);
printf("input passwd:"); //输入密码
while(1)
{
if(i >= 3) //输入密码错误超过3次,退出
{
i++;
break;
}
else if(i > 0 && i < 3) //判断输入密码次数,小于三时继续
{
for( j = 1; j <= s->length;j++)
printf(" ");
clearstack(s); //清空栈
}
for(;;)
{
system("stty -echo"); //输入密码,屏幕中不显示
ch = getchar();
system("stty echo");
if( ch != '\n')
{
if(ch == ' ')
{
pop(s);
}
else{
printf("*");
Push(s,ch);
}
j = s -> length;
}
else
{
printf("\n");
break;
}
}
i ++;
if(k != j) //判断密码长度是否匹配
{
printf(" no match password length \n");
continue;
}
else
{
a = (DataType*)malloc(s -> length *sizeof(DataType));
change(s,a); //获取栈内密码
for(j = 1; j <= s -> length;) //比较密码
{
if(*(a+j-1) == PASSWORD[j-1])
j++;
else
{
j = s->length + 2;
printf("\n password wrong!\n");
break;
}
}
if( j == s->length + 2)
continue;
else
break;
}
}
if(i == 4)
printf("\n have no chance,It will quit!\n"); //输入超过三次退出
else
{
printf("\n password right!\n");
free(a);
}
}
int main(int argc, char **argv)
{
SeqStack L1;
Initial(&L1); //初始化栈
PwdSet(&L1); //输入密码并判断
return 0;
}
样例输入输出:
input passwd:******
no match password length
*****
password wrong!
*****
password right!