栈与队列————100.用栈设置密码

要求说明:用栈设置一个密码,当输入错误时,系统提示密码错误,输入错误三次退出。输入正确密码后显示密码正确。程序密码为“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!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值