#数据结构#第三章:栈

判断题

1-1.通过对堆栈S操作:Push(S,1), Push(S,2), Pop(S), Push(S,3), Pop(S), Pop(S)。输出的序列为:123。

F

1-2.若一个栈的输入序列为1,2,3,…,N,输出序列的第一个元素是i,则第j个输出元素是j−i−1。 (2分)

F,一串数据依次通过一个栈,并不能保证出栈数据的次序总是倒置,可以产生多种出栈序列。一串数据通过一个栈后的次序由每个数据之间的进栈、出栈操作序列决定,只有当所有数据“全部进栈后再全部出栈”才能使数据倒置。事实上,存在一种操作序列――“进栈、出栈、进栈、出栈……”――可以使数据通过栈后仍然保持次序不变。
题目中输出序列的第一个元素是i,则第j个输出元素是不确定的。

1-3.若一个栈的输入序列为{1, 2, 3, 4, 5},则不可能得到{3, 4, 1, 2, 5}这样的出栈序列。 (2分)

T

选择题

2-1.给定一个堆栈的入栈序列为{ 1, 2, ⋯, n },出栈序列为{ p​1​​, p​2​​, ⋯, p​n​​ }。如果p​2​​=n,则存在多少种不同的出栈序列?(2分)

A. 1
B. 2
C.n−1
D. n

C

2-2.设一个堆栈的入栈顺序是1、2、3、4、5。若第一个出栈的元素是4,则最后一个出栈的元素必定是: (2分)

A.1
B.3
C.5
D.1或者5

D

2-3.从栈顶指针为ST的链栈中删除一个结点且用X保存被删结点的值,则执行: (2分)

X= ST->data;
X= ST; ST = ST->next;
X= ST->data; ST = ST->next;
ST = ST->next; X= ST->data;

C

2-4.设栈S和队列Q的初始状态均为空,元素a、b、c、d、e、f、g依次进入栈S。若每个元素出栈后立即进入队列Q,且7个元素出队的顺序是b、d、c、f、e、a、g,则栈S的容量至少是:

A.1
B.2
C.3
D.4

C

2-5.假设有5个整数以1、2、3、4、5的顺序被压入堆栈,且出栈顺序为3、5、4、2、1,那么为了获得这样的输出,堆栈大小至少为:
A.2
B.3
C.4
D.5

C

2-6.若元素a、b、c、d、e、f依次进栈,允许进栈、退栈操作交替进行,但不允许连续三次进行退栈工作,则不可能得到的出栈序列是?

A.b c a e f d
B.c b d a e f
C.d c e b f a
D.a f e d c b

D

2-7.设一个栈的输入序列是1、2、3、4、5,则下列序列中,是栈的合法输出序列的是?

A.3 2 1 5 4
B.5 1 2 3 4
C.4 5 1 3 2
D.4 3 1 2 5

A

2-8.有六个元素以6、5、4、3、2、1的顺序进栈,问哪个不是合法的出栈序列?

A.2 3 4 1 5 6
B.3 4 6 5 2 1
C.5 4 3 6 1 2
D.4 5 3 1 2 6

B

2-9.若一个栈的入栈序列为1、2、3、…、N,输出序列的第一个元素是i,则第j个输出元素是:

A.i−j−1
B.i−j
C.j−i−1
D.不确定

D

**2-10.若一个栈的入栈序列为1、2、3、…、N,其输出序列为p​1​​、p​2​​、p​3​​、…、p​N​​。若p​1​​=N,则p​i​​为: **

A.i
B.n−i
C.n−i+1
D.不确定

C

2-11.将5个字母ooops按此顺序入栈,则有多少种不同的出栈顺序可以仍然得到ooops? (2分)

A.1
B.3
C.5
D.6

C
jcjcjc
jjjccc
jjccjc
jcjjcc
jjcjcc

2-12.栈的插入和删除操作在( )进行。 (2分)

A.栈顶
B.栈底
C.任意位置
D.指定位置

A

2-13.线性表、堆栈、队列的主要区别是什么?(1分)

A.线性表用指针,堆栈和队列用数组
B.堆栈和队列都是插入、删除受到约束的线性表
C.线性表和队列都可以用循环链表实现,但堆栈不能
D.堆栈和队列都不是线性结构,而线性表是

B

编程题

7-1 一元多项式求导 (20 分)

设计函数求一元多项式的导数。

输入格式:

以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。

输出格式:

以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。

输入样例
3 4 -5 2 6 1 -2 0

输出样例
12 3 -10 1 6 0

参考代码

#include<bits/stdc++.h>
using namespace std;

int main()
{
    
    int a, b, flag = 0;
    while(cin>>a>>b)
    {
        if(b == 0)
            continue;
        else
        {
            if(flag == 0)
            {
                cout<<a * b<<" "<<b - 1;
            }
            else
            {
                cout<<" "<<a * b<<" "<<b - 1;
            }
            flag = 1;
        }
    }
    if(flag == 0)
        cout<<"0 0";
    return 0;

}

7-3 符号配对 (20 分)

请编写程序检查C语言源程序中下列符号是否配对:/**/()[]{}

输入格式:

输入为一个C语言源程序。当读到某一行中只有一个句点.和一个回车的时候,标志着输入结束。程序中需要检查配对的符号不超过100个。
输出格式:

首先,如果所有符号配对正确,则在第一行中输出YES,否则输出NO。然后在第二行中指出第一个不配对的符号:如果缺少左符号,则输出?-右符号;如果缺少右符号,则输出左符号-?

输入样例1
void test()
{
int i, A[10];
for (i=0; i<10; i++) /*/
A[i] = i;
}
.

输出样例1
NO
/*-?

输入样例2
void test()
{
int i, A[10];
for (i=0; i<10; i++) /**/
A[i] = i;
}]
.

输出样例2
NO
?-]

输入样例3
void test()
{
int i
double A[10];
for (i=0; i<10; i++) /**/
A[i] = 0.1*i;
}
.

输出样例3
YES

参考代码

#include<bits/stdc++.h>

using namespace std;

stack<char> c;
int flag = 1;

int check(char ch)
{
    char s;
    if(!c.empty())
    {
        s = c.top();
        if(s == '(' && ch== ')' )
            c.pop();
        else if(s == '[' && ch == ']')
            c.pop();
        else if(s == '{' && ch == '}')
            c.pop();
        else if(s == '*' && ch == '*')
            c.pop();
        else
        {
            cout<<"NO"<<endl;
            if(s == '(')
               cout<<"(";
            if(s == '[')
               cout<<"[";
            if(s == '{')
               cout<<"{";
            if(s == '*')
               cout<<"/*";
            cout<<"-?"<<endl;
            flag = 0;
        }
    }
    else
    {
        cout<<"NO"<<endl;
        cout<<"?-";
        if(ch == ')')
            cout<<")";
        if(ch == ']')
            cout<<"]";
        if(ch == '}')
            cout<<"]";
        if(ch == '*')
            cout<<"*/";
        cout<<endl;
        flag = 0;
    }
}

int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    int i;
    char now, next;
    string ch;
    while(getline(cin, ch), ch != ".")
    {
        if(flag == 0)
            continue;
        for(i = 0; i < ch.length(); i++)
        {
            now = ch[i];
            next = ch[i + 1];
            if(now == '(' || now == '[' || now == '{')
                c.push(now);
            else if(i + 1 < ch.length() && now == '/' && next == '*')
            {
                c.push('*');
                i++;
            }
            else if(now == ')' || now == ']' || now == '}' || (now == '*' && next == '/') )
            {
                if(now == '*' && next == '/')
                    i++;
                check(now);
            }
            if(flag == 0)
                break;
        }
    }
    if(!c.empty() && flag == 1)
        check(' ');
    if(flag == 1)
        cout<<"YES"<<endl;
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值