判断题
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 },出栈序列为{ p1, p2, ⋯, pn }。如果p2=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,其输出序列为p1、p2、p3、…、pN。若p1=N,则pi为: **
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;
}