(3+2)专科段数据结构专项练习:7--139到7--141

7--139  有趣的括号

括号()的组合千奇百怪,Drizzle 想知道各种组合的括号可以是否合法
合法要求:每个同类型的左括号必须有与之对应的同类的右括号以正确的顺序闭合

要求:

输入:输入一个括号字符串
输出:输出是否合法,是则True,否则False

答案:

#include<bits/stdc++.h>
using namespace std;
stack<char>A;
int main()
{
    char a[10005];
    cin>>a;
    for(int i=0;i<strlen(a);i++)
    {
        if(a[i]=='('||a[i]=='['||a[i]=='{')
        {
            A.push(a[i]);
        }
        else
        {
            if(A.empty())
            {
                cout<<"False"<<endl;
                return 0;
            }
            else if(a[i]==')'&&A.top()!='(')
            {
                cout<<"False"<<endl;
                return 0;
            }
            else if(a[i]=='}'&&A.top()!='{')
            {
                cout<<"False"<<endl;
                return 0;
            }
            else if(a[i]==']'&&A.top()!='[')
            {
                cout<<"False"<<endl;
                return 0;
            }
            else
                A.pop();
        }
    }
    if(A.empty())
        cout<<"True"<<endl;
    else
        cout<<"False"<<endl;
    return 0;
}

//答案来自:(7条消息) PTA堆栈—有效括号判断_Scream;的博客-CSDN博客

7--140   山

Drizzle 前往山地统计大山的数目,现在收到这片区域的地图,地图中用0(平地)1(山峰)绘制而成,请你帮忙计算其中的大山数目
山总是被平地四面包围着,每一座山只能在水平或垂直方向上连接相邻的山峰而形成。一座山峰四面被平地包围,这个山峰也算一个大山
另外,你可以假设地图的四面都被平地包围着。

要求:

输入:第一行输入M,N分别表示地图的行列,接下来M行每行输入N个数字表示地图
输出:输出一个整数表示大山的数目

答案: 

#include <stdio.h>
#include <stdlib.h>
int a[2100][2100];//存放地图
int n,m;
int maxx;///最后结果 山的个数
int doit(int x,int y)///条件:1.坐标 2.图a中值为0。  不满足返回0 满足 在向上下左右探索,最后返回1
{
    if(x>n||y>m||x<1||y<1||a[x][y]==0)
        return 0;
    a[x][y]=0;
    doit(x+1,y);
    doit(x,y+1);
    doit(x-1,y);
    doit(x,y-1);
    return 1;
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++)
            scanf("%d",&a[i][j]);
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++)
            if(doit(i,j)>0)//满足条件的点返回1,记入山的个数中
                maxx++;
    printf("%d",maxx);
    return 0;
}

//答案来自7-10 山 (100 分)_白—的博客-CSDN博客

7--141 文本转换

艾迪正在打一篇稿子,稿子只包含空格和26个小写字母。但他的键盘中有6个按键出现了故障,当按下k键时会使当前输入光标左移一个字符位置(如果光标在文档头则不左移),当按下z键时会使当前输入光标右移一个字符位置(如果光标在文档尾则不右移),当按下w键时会使当前输入光标移至文档开始位置,当按下s键时会使当前输入光标移至文档尾,当按下q键时会删除当前输入光标前的一个字符,当按下m键时会使输入光标在插入和改写(覆盖)状态切换(初始是插入状态)。现给定艾迪的原始稿子,请编写程序输出使用故障键盘打出的稿件,即屏幕最终显示的文本。

关于m键的解释:若当前输入状态是ab|cd(|表示光标):(1)若处在插入状态,则输入字符插入到光标后面,如输入x,则变为abx|cd;(2)若处在改写(覆盖)状态,则输入字符覆盖光标后面的字符,如输入x,则变为abx|d。(3)初始时为插入状态,按一下m键切换到改写状态,再按一下m键切换回插入状态,再按一下m键,切换到改写状态......以此类推。

输入格式:

输入为一行字符,字符个数不超过50000,包含a-z的小写字母及空格,表示艾迪的原始稿件。

输出格式:

输出为一行字符,表示在艾迪使用故障键盘实际打出来的文本。

答案: 

#include <algorithm> 
#include <cstring>
#include <iostream>
using namespace std;

typedef struct LNode {
    char ch;
    LNode* next;
    LNode* prev;
} * List;

int main() {
    char ch;
    List start, end, tmp;  //带空头节点链表, 每次插入tmp后面
    List L = new LNode();
    start = L;
    end = L;
    tmp = L;

    bool isInsert = true;

    List ins;
    while (scanf("%c", &ch) && ch != '\n') {
        if (ch == 'w') {
            tmp = start;
        } else if (ch == 's') {
            tmp = end;
        } else if (ch == 'k') {
            if (tmp->prev) tmp = tmp->prev;
        } else if (ch == 'z') {
            if (tmp->next) tmp = tmp->next;
        } else if (ch == 'm') {
            isInsert = !isInsert;
        } else if (ch == 'q') {  //删除tmp
            if (tmp->prev) {
                List t = tmp;
                tmp->prev->next = tmp->next;
                if (tmp->next) {
                    tmp->next->prev = tmp->prev;
                    tmp = tmp->prev;
                } else {
                    tmp = tmp->prev;
                    tmp->next = NULL;
                }
                delete t;
                if (tmp->next == NULL) end = tmp;  //如果是删除最后的, 更新end
            }
        } else {  // tmp后面添加
            ins = new LNode();
            ins->ch = ch;
            ins->next = tmp->next;
            ins->prev = tmp;
            tmp->next = ins;
            tmp = ins;
            if (tmp->next == NULL) end = tmp;  //如果插入在最后, 更新end
            if (!isInsert && tmp->next) {  //如果是替换, 且tmp下一个存在, 再删除tmp下一个
                List t = tmp->next;
                if (t->next) {
                    tmp->next = t->next;
                    t->next->prev = tmp;
                    delete t;
                } else {    //删除元素在末尾
                    delete t;
                    end = tmp;  //更新end
                    tmp->next = NULL;
                }
            }
        }
        // end->next = NULL;    //保险, 但没必要
    }

    tmp = start->next;
    while (tmp) {
        printf("%c", tmp->ch);
        tmp = tmp->next;
    }
    // 注意清理内存, 这里节省运行时间不清理

    return 0;
}

//题型差不多,答案借鉴于  (7条消息) PTA 小明打字 (10分)(数据结构 + 双向链表)_不导翁的博客-CSDN博客

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值