卡码网刷题记录17-18

17.出栈合法性

题目描述

已知自然数1,2,...,N(1<=N<=100)依次入栈,请问序列C1,C2,...,CN是否为合法的出栈序列。

输入描述

输入包含多组测试数据。
每组测试数据的第一行为整数N(1<=N<=100),当N=0时,输入结束。
第二行为N个正整数,以空格隔开,为出栈序列。

输出描述

对于每组输入,输出结果为一行字符串。
如给出的序列是合法的出栈序列,则输出Yes,否则输出No。

输入示例

5
3 4 2 1 5
5
3 5 1 4 2
0

输出示例

Yes
No

题解(C语言):

#include <stdio.h>

int main(){
    int n;
    int nums[105];
    while(scanf("%d",&n)!= EOF){
        if(n == 0) break;
        for(int i = 0; i < n; i++){
            scanf("%d",&nums[i]);
        }// 出栈序列
        // 模拟栈操作
        int top = -1;
        int index=0;
        int i=1;
        int st[105];
        
        while(i <= n){
            st[++top] = i;
            int flag = 1;
            while (top >= 0 && st[top] == nums[index]) {
                top--;
                index++;
            }
            i++;
        }
        if( top == -1 && index == n){
            printf("Yes\n");
        }else{
            printf("No\n");
        }
    }
    
    return 0;
}

思路:模拟栈操作

18.链表的基本操作

题目描述

本题考察链表的基本操作。温馨提示:本题较为复杂,需要细心多花一些时间。

输入描述

输入数据只有一组,第一行有n+1个整数,第一个整数是这行余下的整数数目n,后面是n个整数。

这一行整数是用来初始化列表的,并且输入的顺序与列表中的顺序相反,也就是说如果列表中是1、2、3那么输入的顺序是3、2、1。

第二行有一个整数m,代表下面还有m行。每行有一个字符串,字符串是“get”,“insert”,“delete”,“show”中的一种。
 

如果是“get”,代表获得第a个元素。(a从1开始计数)

如果是“delete”,代表删除第a个元素。(a从1开始计数)

如果是“insert”,则其后跟着两个整数a和e,代表在第a个位置前面插入e。(a从1开始计数)

“show”之后没有正数,直接打印链表全部内容。

输出描述

如果获取成功,则输出该元素;

如果删除成功,则输出“delete OK”;

如果获取失败,则输出“get fail”

如果删除失败,则输出“delete fail”

如果插入成功,则输出“insert OK”,否则输出“insert fail”。

如果是“show”,则输出列表中的所有元素,如果列表是空的,则输出“Link list is empty”

注:所有的双引号均不输出。

输入示例

3 3 2 1
21
show
delete 1
show
delete 2
show
delete 1
show
delete 2
insert 2 5
show
insert 1 5
show
insert 1 7
show
insert 2 5
show
insert 3 6
show
insert 1 8
show
get 2

输出示例

1 2 3
delete OK
2 3
delete OK
2
delete OK
Link list is empty
delete fail
insert fail
Link list is empty
insert OK
5
insert OK
7 5
insert OK
7 5 5
insert OK
7 5 6 5
insert OK
8 7 5 6 5
7

题解(C语言):

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
 
typedef struct List{
    int elem;
    struct List *next;
}List;
 
void get(List *l,int n)
{
    List *p;
    int flag = 0;
    p = l;
    while(p->next != NULL)
    {
        n --;
        if(n == 0)
        {
            flag = 1;
            break;
        }
        p = p->next;
    }
    if(flag == 1)
    {
        printf("%d\n",p->next->elem);
    }
    else
    {
        printf("get fail\n");
    }
}
 
void insert(List *l,int n,int e)
{
    int flag = 0;
    List *p,*q;
    q = (List *)malloc(sizeof(List));
    q->elem = e;
    q -> next = NULL;
    p = l;
    do
    {
        n --;
        if(n == 0)
        {
            flag = 1;
            break;
        }
        p = p ->next;
    }while(p != NULL);
    if(flag)
    {
        q->next = p->next;
        p->next = q;
        printf("insert OK\n");
    }
    else
    {
        printf("insert fail\n");
    }
}
 
void dele(List *l,int n)
{
    List *p,*q;
    int flag = 0;
    p = l;
    while(p->next != NULL)
    {
        n --;
        if(n == 0)
        {
            flag = 1;
            break;
        }
        p = p->next;
    }
    if(flag == 1)
    {
        q = p->next;
        p->next = p->next->next;
        free(q);
        printf("delete OK\n");
    }
    else
    {
        printf("delete fail\n");
    }
}
 
void show(List *l)
{
    List *p;
    p = l;
    if(l->next == NULL)
    {
        printf("Link list is empty\n");
        return;
    }
    while(p->next != NULL)
    {
        if(p->next->next != NULL)
            printf("%d ",p->next->elem);
        else
            printf("%d\n",p->next->elem);
        p = p->next;
    }
}
 
int main()
{
    int n,m;
    int x,y;
    int i;
    List *l,*p;
    char order[10];
    l = (List *)malloc(sizeof(List));
    l->next = NULL;
    scanf("%d",&n);
    for(i = 0;i < n;i ++)
    {
        p = (List*)malloc(sizeof(List));
        p->next = NULL;
        scanf("%d",&p->elem);
        p->next = l->next;
        l->next = p;
    }   
    scanf("%d",&m);
    getchar();
    while(m != 0)
    {
        m --;
        scanf("%s",order);

        if(strcmp(order,"get") == 0)
        {
            scanf("%d",&x);
            getchar();
            get(l,x);
        }
        else if(strcmp(order,"insert") == 0)
        {
            scanf("%d%d",&x,&y);
            getchar();
            insert(l,x,y);
        }
        else if(strcmp(order,"delete") == 0)
        {
            scanf("%d",&x);
            getchar();
            dele(l,x);
        }
        else if(strcmp(order,"show") == 0)
        {
            show(l); 
        }
    }
    return 0;
}

  • 12
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值