数据结构讲题云集

要给学习数据结构的同学讲的题目答案(写的简单一点,好懂一点):

数据结构实验之栈:行编辑器

Time Limit: 1000MS  Memory Limit: 65536KB
Problem Description
 一个简单的行编辑程序的功能是:接受用户从终端输入的程序或数据,并存入用户的数据区。 
 
由于用户在终端上进行输入时,不能保证不出差错,因此,若在编辑程序中,“每接受一个字符即存入用户数据区”的做法显然不是最恰当的。较好的做法是,设立一个输入缓冲区,用以接受用户输入的一行字符,然后逐行存入用户数据区。允许用户输入出差错,并在发现有误时可以及时更正。例如,当用户发现刚刚键入的一个字符是错的时,可补进一个退格符"#",以表示前一个字符无效; 
 
如果发现当前键入的行内差错较多或难以补救,则可以键入一个退行符"@",以表示当前行中的字符均无效。 
 
如果已经在行首继续输入'#'符号无效。 
Input
 输入多行字符序列,行字符总数(包含退格符和退行符)不大于250。 
Output
 按照上述说明得到的输出。 
Example Input
whli##ilr#e(s#*s)
outcha@putchar(*s=#++);
Example Output
while(*s)
putchar(*s++);

代码:

#include <stdio.h>
#include <string.h>

int main()
{
    int i;
    char st[300];
    char ch[300];
    while ( ~scanf( "%s", st ) )
    {
        int len = strlen(st);
        int top = -1;
        for ( i = 0; i < len; i++ )
        {
            if ( st[i] == '#' )
            {
                if ( top >= 0 )
                    top--;
            }
            else if ( st[i] == '@' )
                top = -1;
            else
                ch[++top] = st[i];
        }
        for ( i = 0;i <= top; i++ )
        {
            printf ( "%c", ch[i] );
        }
        printf ( "\n" ) ;
    }
    return 0;
}

数据结构实验之栈七:出栈序列判定

Time Limit: 30MS Memory Limit: 1000KB
Problem Description

给一个初始的入栈序列,其次序即为元素的入栈次序,栈顶元素可以随时出栈,每个元素只能入栈依次。输入一个入栈序列,后面依次输入多个序列,请判断这些序列是否为所给入栈序列合法的出栈序列。

例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个出栈序列,但4,3,5,1,2就不可能是该序列的出栈序列。假设压入栈的所有数字均不相等。

Input
 第一行输入整数n(1<=n<=10000),表示序列的长度。

第二行输入n个整数,表示栈的压入顺序。

第三行输入整数t(1<=t<=10)。

后面依次输入t行,每行n个整数,表示要判断的每一个出栈序列。

Output
 对应每个测试案例输出一行,如果由初始入栈序列可以得到该出栈序列,则输出yes,否则输出no。

Example Input
5
1 2 3 4 5
2
4 5 3 2 1
4 3 5 1 2
Example Output
yes
no

代码:

#include <stdio.h>
#include <string.h>

int s[10005];
int a[10005];
int b[10005];

int main()
{
    int n, i;
    int T;
    scanf ( "%d", &n );
    for ( i = 0;i < n; i++ )
        scanf ( "%d", &a[i] );
    scanf ( "%d", &T );
    while ( T-- )
    {
        for ( i = 0;i < n; i++ )
            scanf ( "%d", &b[i] );
        int A = 0, B = 0;
        int ok = 1;
        int top = -1;
        while ( B < n )
        {
            if ( a[A] == b[B] )
            {
                A++;
                B++;
            }
            else if ( top != -1&&s[top] == b[B] )
            {
                top--;
                B++;
            }
            else if ( A < n )
            {
                s[++top] = a[A];
                A++;
            }
            else
            {
                ok = 0;
                break;
            }
        }
        if ( ok == 1 )
            printf ( "yes\n" );
        else
            printf ( "no\n" );
    }
    return 0;
}

数据结构实验之栈八:栈的基本操作

Time Limit: 1000MS Memory Limit: 65536KB
Problem Description

堆栈是一种基本的数据结构。堆栈具有两种基本操作方式,push 和 pop。push一个值会将其压入栈顶,而 pop 则会将栈顶的值弹出。现在我们就来验证一下堆栈的使用。

Input

首先输入整数t(1 <= t <= 10),代表测试的组数,以后是 t 组输入。
 对于每组测试数据,第一行输入两个正整数 m(1 <= m <= 100)、n(1 <= n <= 1000),其中m代表当前栈的最大长度,n代表本组测试下面要输入的操作数。 而后的 n 行,每行的第一个字符可能是'P’或者'O’或者'A’;如果是'P’,后面还会跟着一个整数,表示把这个数据压入堆栈;如果是'O’,表示栈顶元素出栈;如果是'A',表示询问当前栈顶的值'。

Output

 对于每组测试数据,根据其中的命令字符来处理堆栈;
(1)对所有的'P'操作,如果栈满输出'F',否则完成压栈操作;
(2)对所有的'A'操作,如果栈空,则输出'E',否则输出当时栈顶的值;
(3)对所有的'O'操作,如果栈空,则输出'E',否则输出栈顶元素的值,并让其出栈;
每个输出占据一行,每组测试数据(最后一组除外)完成后,输出一个空行。

Example Input
2
5 10
A
P 9
A
P 6
P 3
P 10
P 8
A
P 2
O
2 5
P 1
P 3
O
P 5
A
Example Output
E
9
8
F
8
 
 
3
5

代码:

#include <stdio.h>
#include <string.h>

int s[10005];

int main()
{
    int n, m;
    int T, i;
    char ch[12];
    scanf ( "%d", &T );
    while ( T-- )
    {
        int top = -1;
        scanf ( "%d %d", &n, &m );
        for ( i = 0; i < m; i++ )
        {
            scanf ( "%s", ch );
            if ( strcmp(ch, "A") == 0  )
            {
                if ( top == -1 )
                    printf ( "E\n" );
                else
                    printf ( "%d\n", s[top] );
            }
            else if ( strcmp(ch, "P") == 0 )
            {
                int t;
                scanf ( "%d", &t );
                if ( top+1 == n )
                    printf ( "F\n" );
                else
                    s[++top] = t;
            }
            else if ( strcmp(ch, "O") == 0 )
            {
                if ( top == -1 )
                    printf ( "E\n" );
                else
                {
                    printf ( "%d\n", s[top] );
                    top--;
                }
            }
        }
        if ( T != 0 )
            printf ( "\n" );
    }
    return 0;
}

代码菜鸟,如有错误,请多包涵!!!

如有帮助记得支持我一下,谢谢!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值