中国长城计算机深圳股份有限公司2月招聘面试题117道2020215

试题五(共 15分)

阅读以下说明和C++代码,将应填入 (n) 处的字句写在答题纸的对应栏内。

【说明】

已知类 LinkedList 表示列表类,该类具有四个方法:addElement()、lastElement()、umberOfElement()以及removeLastElement()。四个方法的含义分别为:

void addElement(Object): 在列表尾部添加一个对象;

Object lastElement(): 返回列表尾部对象;

int numberOfElement(): 返回列表中对象个数;

void removeLastElement(): 删除列表尾部的对象。

现需要借助LinkedList来实现一个Stack栈类,C++代码1和C++代码2分别采用继承和组合的方式实现。

【C++代码 1】

class Stack :public LinkedList{

public:

void push(Object o){ addElement(o); }; //压栈

Object peek(){ return (1) ; }; //获取栈顶元素

bool isEmpty(){ //判断栈是否为空

return numberOfElement() == 0;

};

Object pop(){ //弹栈

Object o = lastElement();

(2) ;

return o;

};

};

【C++代码 2】

class Stack {

private:

(3) ;

public:

void push(Object o){ //压栈

list.addElement(o);

};

Object peek(){ //获取栈顶元素

return list. (4) ;

};

bool isEmpty(){ //判断栈是否为空

return list.numberOfElement() == 0;

};

Object pop(){//弹栈

Object o = list.lastElement();

list.removeLastElement();

return o;

};

};

【问题】

若类LinkedList新增加了一个公有的方法removeElement(int index),用于删除列表中第index个元素,则在用继承和组合两种实现栈类Stack的方式中,哪种方式下Stack对象可访问方法removeElement(int index)? (5) (A. 继承 B. 组合)


正确答案:
试题五参考答案
(1)lastElement()            (3分)
(2)removeLastElement()          (3分)
(3)LinkedList list           (3分)
(4)lastElement()            (3分)
(5)A,或继承            (3分)


试题六(共 15分)

阅读以下说明和Java代码,将应填入 (n) 处的字句写在答题纸的对应栏内。

【说明】

已知类 LinkedList 表示列表类,该类具有四个方法:addElement()、lastElement()、umberOfElement()以及removeLastElement()。四个方法的含义分别为:

void addElement(Object): 在列表尾部添加一个对象;

Object lastElement(): 返回列表尾部对象;

int numberOfElement(): 返回列表中对象个数;

void removeLastElement(): 删除列表尾部的对象。

现需要借助LinkedList来实现一个Stack栈类, Java代码1和Java代码2分别采用继承和组合的方式实现。

【Java代码1】

public class Stack extends LinkedList{

public void push(Object o){ //压栈

addElement(o);

}

public Object peek(){ //获取栈顶元素

return (1) ;

}

public boolean isEmpty(){ //判断栈是否为空

return numberOfElement() == 0;

}

public Object pop(){ //弹栈

Object o = lastElement();

(2) ;

return o;

}

}

【Java代码2】

public class Stack {

private (3) ;

public Stack(){

list = new LinkedList();

}

public void push(Object o){

list.addElement(o);

}

public Object peek(){//获取栈顶元素

return list. (4) ;

}

public boolean isEmpty(){//判断栈是否为空

return list.numberOfElement() == 0;

}

public Object pop(){ //弹栈

Object o = list.lastElement();

list.removeLastElement();

return o;

}

}

【问题】

若类LinkedList新增加了一个公有的方法removeElement(int index),用于删除列表中第index个元素,则在用继承和组合两种实现栈类Stack的方式中,哪种方式下Stack对象可访问方法removeElement(int index)? (5) (A. 继承 B. 组合)


正确答案:

试题六参考答案
(1)lastElement()            (3分)
(2)removeLastElement()          (3分)
(3)LinkedList list           (3分)
(4)lastElement()            (3分)
(5)A,或继承            (3分)

 


试题四

阅读以下说明和C代码,将应填入 (n) 处的字句写在答题纸的对应栏内。

[说明]

函数MultibaseOutput(long n, int B)的功能是:将一个无符号十进制整数n转换成B(2≤B≤16)进制数并输出。该函数先将转换过程中得到的各位数字入栈,转换结束后再把B进制数从栈中输出。有关栈操作的诸函数功能见相应函数中的注释。C代码中的符号常量及栈的类型定义如下:

#define MAXSIZE 32

typedef struct {

int *elem; /* 栈的存储区 */

int max; /* 栈的容量,即栈中最多能存放的元素个数 */

int top; /* 栈顶指针 */

}Stack;

[C代码]

int InitStack(Stack *S, int n) /* 创建容量为n的空栈 */

{ S->elem = (int *)malloc(n * sizeof(int));

if(S->elem == NULL) return -1;

S->max = n; (1) = 0 ; return 0;

}

int Push(Stack *S, int item) /* 将整数item压入栈顶 */

{ if(S->top == S->max){ printf("Stack is full!\n"); return -1;}

(2) = item ; return 0;

}

int StackEmpty(Stack S) { return (!S.top) ? 1 : 0; } /* 判断栈是否为空 */

int Pop(Stack *S) /* 栈顶元素出栈 */

{ if(!S->top) { printf("Pop an empty stack!\n"); return -1;}

return (3) ;

}

void MultibaseOutput(long n, int B)

{ int m; Stack S;

if (InitStack(&S, MAXSIZE)) {printf("Failure!\n"); return;}

do {

if (Push(&S, (4) )) {printf("Failure!\n"); return;}

n = (5) ;

}while(n != 0);

while(!StackEmpty(S)) { /* 输出B进制的数 */

m = Pop(&S);

if(m < 10) printf("%d", m); /* 小于10,输出数字 */

else printf("%c", m + 55); /* 大于或等于10,输出相应的字符 */

}

printf("\n");

}


正确答案:


【C程序】

#include<stdio.h>

/*此处为栈类型及其基本操作的定义,省略*/

int main(){

STACK station;

int state[1000];

int n; /*车厢数*/

int begin, i, j, maxNo; /*maxNo为A端正待入栈的车厢编号*/

printf("请输入车厢数:");

scanf("%d",&n);

printf(“请输入需要判断的车厢编号序列(以空格分隔):”);

if(n<1)return-1;

for (i=0; i<n; i++) /*读入需要驶出的车厢编号序列,存入数组state[]*/

scanf("%d",&state[i]);

(1) ; /*初始化栈*/

maxNo=1;

for(i=0; i<n; ){ /*检查输出序列中的每个车厢号state[i]是否能从栈中获取*/

if( (2) ){ /*当栈不为空时*/

if (state[i]=Top(station)) { /*栈顶车厢号等于被检查车厢号*/

printf("%d",Top(station));

Pop(&station);i++;

else

if ( (3) ) {

printf(“error\n”);

return 1;

else{

begin= (4) ;

for(j=begin+l;j <=state [i];j++){

Push(&station, j);

}

else{ /*当栈为空时*/

begin=maxNo;

for(j=begin; j<=state[i];j++) {

Push(&station, j);

maxNo= (5) ;

printf("OK");

return 0;


正确答案:
(1)InitStack(&station)
(2)!IsEmpty(station)
(3)state[i]Top(station)
(4)Top(station)
(5)j


●试题七

阅读以下说明和C++程序,将应填入(n)处的字句写在答题纸的对应栏内。

【说明】

以下程序的功能是设计一个栈类stack<T>,并建立一个整数栈。

【程序】

#include<iostream.h>

#include<stdli

B.h>

const int Max=20;∥栈大小

template<class T>

class stack{∥栈元素数组

T s[Max];∥栈顶下标

int top;

public:

stack()

{

top=-1;∥栈顶初始化为-1

}

void push(const T &item);∥item入栈

T pop();∥出栈

int stackempty()const;∥判断栈是否为空

};

template<class T>

void stack<T>::push(const T &item)

{

if(top== (1) )

{

cout<<"栈满溢出"<<endl;

exit (1) ;

}

top++;

s[top]=item;

}

template<class T>

T stack<T>::pop()

{

T temp;

if(top== (2) )

{

cout<<″栈为空,不能出栈操作″<<endl;

exit (1) ;

}

temp=s[top];

top--;

return temp;

}

template<class T>

int stack<T>::stackempty()const

{

return top==-1;

}

void main()

{

stack<int>st;

int a[]={1,2,3,4,5 };

cout<<"整数栈"<<endl;

cout<<"入栈序列:"<<endl;

for(int i=0;i<4;i++)

{

cout<<a[i]<<" ";

(3) ;

}

cout<<endl<<"出栈序列:";

while( (4) )

cout<< (5) <<" ";

cout<<endl;

}


正确答案:

●试题七

【答案】(1)Max-1(2)-1(3)stpush(ai)(4)!ststackempty()(5)stpop()

【解析】本题用类模板方式定义一个栈类,其中有两个私有数据成员:s[](存放栈元素)top(栈顶元素下标),以及3个公有成员函数:push(元素入栈)pop(元素出栈)stackempty(判断栈是否为空)

在函数push()中,首先要判断是否栈满。栈的大小为Max,数组的下标从0开始,所以栈满的条件是栈顶元素下标为Max-1,所以(1)空应填入"Max-1"。同样,在函数pop()中,首先要判断是否为空栈,由于栈顶初始化为-1,所以(2)空应填入"-1"。

在主函数中,先进行入栈操作,所以(3)空应填入"stpush(ai)"。然后进行出栈操作,判断栈是否为空,调用对象的函数stackempty(),所以(4)空应填入"! ststackempty()"。(5)空处调用出栈函数,所以应填入"stpop()"。

 


中国长城计算机深圳股份有限公司2月招聘面试题面试题面试官常问到的一些题目整理如下:问题 Q1:请用代码简答实现stack?可用的回答 : stack的实现代码(使用python内置的list),实现起来是非常的简单,就是list的一些常用操作 class Stack(object): def _init_(self): self.stack = def push(self, value): # 进栈 self.stack.append(value) def pop(self): #出栈 if self.stack: self.stack.pop() else: raise LookupError(stack is empty!) def is_empty(self): # 如果栈为空 return bool(self.stack) def top(self): #取出目前stack中最新的元素 return self.stack-1 问题 Q2:.什么是关联查询,有哪些?可用的回答 :将多个表联合起来进行查询,主要有内连接、左连接、右连接、全连接(外连接)问题 Q3:用Python匹配HTML tag的时候,和有什么区别?可用的回答 :术语叫贪婪匹配( )和非贪婪匹配( )问题 Q4:用尽量多的方法实现单例模式?可用的回答 : 一、模块单例 Python 的模块就是天然的单例模式,因为模块在第一次导入时,会生成.pyc文件,当第二次导入时,就会直接加载.pyc文件,而不会再次执行模块代码。 二、静态变量方法 先执行了类的_new_方法(我们没写时,默认调用object._new_),实例化对象; 然后再执行类的_init_方法,对这个对象进行初始化,所有我们可以基于这个,实现单例模式。 class Singleton(object): def _new_(cls,a): if not hasattr(cls, _instance): cls._instance = object._new_(cls) return cls._instance def _init_(self,a): self.a = a 问题 Q5:创建一个简单tcp服务器需要的流程?可用的回答 : 1.socket创建一个套接字 2.bind绑定ip和port 3.listen使套接字变为可以被动链接 4.accept等待客户端的链接 5.recv/send接收发送数据 问题 Q6:数据库的优化?可用的回答 : 1. 优化索引、SQL 语句、分析慢查询; 2. 设计表的时候严格根据数据库的设计范式来设计数据库; 3. 使用缓存,把经常访问到的数据而且不需要经常变化的数据放在缓存中,能节约磁盘IO; 4. 优化硬件;采用SSD,使用磁盘队列技术(RAID0,RAID1,RDID5)等; 5. 采用MySQL 内部自带的表分区技术,把数据分层不同的文件,能够提高磁盘的读取效率; 6. 垂直分表;把一些不经常读的数据放在一张表里,节约磁盘I/O; 7. 主从分离读写;采用主从复制把数据库的读操作和写入操作分离开来; 8. 分库分表分机器(数据量特别大),主要的的原理就是数据路由; 9. 选择合适的表引擎,参数上的优化; 10. 进行架构级别的缓存,静态化和分布式; 11. 不采用全文索引; 12. 采用更快的存储方式,例如 NoSQL存储经常访问的数据 问题 Q7:有哪些工具可以帮助查找错误或执行静态分析?可用的回答 : PyChecker是一个静态分析工具,可以检测Python源代码中的错误,并警告错误的风格和复杂性。 Pylint是另一种验证模块是否符合编码标准的工具。 auto-pep8工具也可以进行静态代码检查 问题 Q8:用尽量多的方法实现单例模式?可用的回答 : 一、模块单例 Python 的模块就是天然的单例模式,因为模块在第一次导入时,会生成.pyc文件,当第二次导入时,就会直接加载.pyc文件,而不会再次执行模块代码。 二、静态变量方法 先执行了类的_new_方法(我们没写时,默认调用object._new_),实例化对象; 然后再执行类的_init_方法,对这个对象进行初始化,所有我们可以基于这个,实现单例模式。 class Singleton(object): def _new_(cls,a): if not hasattr(cls, _instance): cls._instance = object._new_(cls) return cls._instance def _init_(self,a): self.a = a 问题 Q9:为何基于tcp协议的通信比基于udp协议的通信更可靠?可用的回答 : TCP的可靠保证,是它的三次握手双向机制,这一机制保证校验了数据,保证了他的可靠性。

请使用VC6或使用【答题】菜单打开考生文件夹proj2下的工程proj2,此工程包含有一个源程序文件proj2.cpp,其中定义了Stack类和ArrayStack类。 Stack是一个用于表示数据结构“栈”的类,栈中的元素是字符型数据。Stack为抽象类,它只定义了栈的用户接口,如下所示: 公有成员函数 功能 push 入栈:在栈顶位置添加一个元素 pop 退栈:取出并返回栈顶元素 ArrayStack是Stack的派生类,它实现了Stack定义的接口。ArrayStack内部使用动态分配的字符数组作为栈元素的存储空间。数据成员maxSize表示的是栈的最大容量,top用于记录栈顶的位置。成员函数push和pop分别实现具体的入栈和退栈操作。 请在程序中的横线处填写适当的代码,然后删除横线,以实现上述功能。此程序的正确输出结果应为: a,b,C C,b,a 注意:只在指定位置编写适当代码,不要改动程序中的其他内容,也不要删除或移动“//****料found****”。 //proj2.cpp include<iostream> using namespacc std; class Stack{ public: virtual void push(char C)=0; virtual char pop=0; };

class ArrayStack:public Stack{ char*P; int maxSizc; int top; public: ArravStack(int s) { top=0; maxSize=s: //*********found********* P=______; } ~ArrayStack { //*********found********* _______; } void push(char c) } if(top==maxSize){ cerr<<”Overflow! \n”: return; } //*********found********* _______; top++: } char pop { if(top==0){ cerr<<”Underflow!、n”; return‘\0’; } Top--; //*********found********* ______; } }; void f(Stack&sRef) { char ch[]={‘a’,‘b’,‘c’}; cout<<ch[0]<<”,”<<ch[1]<<”,”<<ch[2]<<endl; sRef.push(oh[0]);sRef.push(ch[1]);sRef.push(ch[2]); cout<<sRef.poP<<”,”; cout<<sRef.poP<<”,”; cout<<sRef.poP<<endl; } int main { ArrayStack as(10); f(as): return 0: }


正确答案:

(1)Ilew char[s]
(2)delete[]P
(3)P[top]=e
(4)return P[top]
【考点分析】
本题主要考查的是表示栈的抽象类Stack类及它的派生类ArrayStaek类、纯虚函数和成员函数。栈的节点一般使用指针表示,定义构造函数时要给指针分配空间,使用New语句来完成。~ArrayStack是析构函数,因为前面已经使用new来分配空间了,因此在这里要用delete语句来释放指针。
【解题思路】
(1)主要考查的是ArrayStack类的构造函数,在函数中要为P申请S个char型空间,应使用语句P=flew char[s];。
(2)主要考查析构函数,使用delete语句释放指针,即delete[]P;。
(3)主要考查push函数,top表示栈顶元素下标,添加的数据放到栈顶,因此使用语句P[top]=c;。
(4)主要考查pop函数,输出栈顶数据,top表示栈顶元素下标,因此使用语句return P[top];。


阅读以下说明和C程序代码,将应填入______处的语句写在答题纸的对应栏内。

[说明]

函数MultibaseOutput(long n,int B)的功能是:将一个无符号十进制整数n转换成 B(2≤B≤16)进制数并输出。该函数先将转换过程中得到的各位数字入栈,转换结束后再把B进制数从栈中输出。有关栈操作的诸函数功能见相应函数中的注释。C代码中的符号常量及栈的类型定义如下:

define MAXSIZE 32

typedef struct{

int * elem; /* 栈的存储区 */

int max; /* 栈的容量,即栈中最多能存放的元素个数 */

int top; /* 栈顶指针 */

}Stack;

[C代码]

int InitStack(Stack * S,int n) / * 创建容量为n的空栈 */

{ S->elem=(int *)malloc(n * sizeof(int));

if(S->elem==NULL)return-1;

S->max=n; (1)=O;return 0;

}

int Push(Stack * S,int item) / * 将整数item压入栈顶 * /

{ if(S->top==S->max){ printf(“Stack is full! \n”);return-1;}

(2)=item;return 0;

}

int StackEmpty(StackS) {return (! S.top)? 1:0;} / * 判断栈是否为空 * /

int Pop(Stack *S ) / * 栈顶元素出栈 * /

{ if(! S->top){printf(“Pop an empty stack! \n”);return-1;}

return (3);

}

void MultibaseOutput(long n,int B)

{ int m;StackS;

if (InitStack(&S,MAXSIZE)){printf(“Failure! \n”);return;}

do {

if(Push(&S, (4) )){printf(“Failure! \n”);return;}

n=(5);

}while(n!=0);

while(! StackEmpty(S)){ / * 输出B进制的数 * /

m=Pop(&S);

if(m<10)printf(“%d”,m); / * 小于10,输出数字 * /

else printf(“%c”,m+55); / * 大于或等于10,输出相应的字符 * /

}

printf(“\n”);

}


正确答案:(1)S->top (2)S->elem[S->top++] (3)S->elem[--S->top] (4)n%B (5)n/B
(1)S->top (2)S->elem[S->top++] (3)S->elem[--S->top] (4)n%B (5)n/B 解析:对于一个栈,首先应对它进行初始化,设置它的容量、栈顶等,一般有2种做法:
(1)top=0。在这种做法下,如果要进行入栈操作,则先将压人栈的元素值赋给栈顶指针所指向的单元,然后栈顶指针加1;如果要进行出栈操作,则将栈顶指针减1,然后将要出栈的元素弹出栈。
(2)top=-1。在这种做法下,如果要进行入栈操作,则首先将栈顶指针加1,然后把压人栈的元素值赋给栈顶指针所指向的单元;如果要进行出栈操作,则首先将要出栈的元素弹出栈,然后再将栈顶指针减1。
显然,在本题中使用的是第一种方法。(1)空填写S->top,使S->top=0。这样将整数item压入栈顶的语句为S->elem[S->top++]=item,即(2)空填写 S->elem[S->top++)。出栈操作是返回S->elem[--S->top)t这是(3)空的答案。
将十进制数n转换为二进制数时,把n除以2的余数压入栈,而用n除以2的商代替 n,依次类推,直到n等于0为止。这时,再把栈中的值一一弹出,就可得到二进制数据。类似地,把十进制数n转换成B进制数的过程也是如此,一般算法描述为(其中S为栈):
do{
n%B入栈;
n=n/B;
}while(n);


已知一棵二叉树用二叉链表存储,t指向根节点,P指向树中任一节点。下列算法为输出从t到P之问路径上的节点。

[C程序]

define MaxSize 1000

typedef struct node {

TelemType data ;

struct node *ichiid,*rchiid;

}BiNode,*BiTree;

void Path(BiTree t,BiNode *P)

{BiTree *stack[Maxsize],*stackl[Maxsize],*q;

int tag[Maxsize],top=0,topl;

q=t;

/*通过先序遍历发现P*/

do{while(q!=NULL &&q!=p)

/*扫描左孩子,_日.相应的节点不为P*/

{ (1) ;

stack[top]=q;

tag[top]=0;

(2) ;

}

if(top>0)

{ if(stack[top]=P) break; /*找到P,栈底到栈顶为t到P*/

if(tag[top]==1)top--;

else { q=stack[top];

q=q->rchiid;

tag[top]=1;

}

}

} (3) ;

top--;topl=0;

while(top>0) {

q=stack[top]; /*反向打印准备*/

topl++;

(4) ;

top--;

}

while( (5) ){ /*打印栈的内容*/

q=stackl[topl]j

printf(q->data);

topl--;

}

}


正确答案:(1)top++ (2) q=q->lchild (3) while(top>0) (4) stackl[topl]=q (5) topl>0
(1)top++ (2) q=q->lchild (3) while(top>0) (4) stackl[topl]=q (5) topl>0 解析:本题本质上是对二叉树的先序遍历进行考核,但不是简单地进行先序遍历,而是仅遍历从根节点到给定的节点p为止。本题采用非递归算法来实现,其主要思想是:①初始化栈;②根节点进栈,栈不空则循环执行以下步骤直到发现节点p;③当前节点不为空且不为P进栈;④栈顶为p,则结束,否则转③;⑤若右子树访问过,则栈顶的右孩子为当前节点,转③。
扫描左孩子,.当相应的节点不为P时进栈,所以(1)填“top++”,(2)填“q=q->lchild”。在栈不为空时则一直在do while循环中查找,因此(3)填“while(top>0)”。在进行反向打印准备时,读取stack[top]的信息放到stackl[topl]中,即(4)填“stackl[top1]=q”。打印栈中所有内容,所以(5)填“topl>0”。


使用VC6打开考生文件夹下的工程test34_3。此工程包含一个test34_3.cpp,其中定义了表示栈的类stack。源程序中stack类的定义并不完整,请按要求完成下列操作,将程序补充完整。

(1)定义类stack的私有数据成员sp和size,它们分别为整型的指针和变量,其中sP指向存放栈的数据元素的数组,size为栈中存放最后一个元素的下标值。请在注释“//**1**”之后添加适当的语句。

(2)完成类stack的构造函数,该函数首先从动态存储空间分配含有100个元素的int型数组,并把该数组的首元素地址赋给指针sp,然后将该数组的所有元素赋值为0,并将size赋值为-1(size等于-1表示栈为空)。请在注释“//**2**”之后添加适当的语句。

(3)完成类stack的成员函数push的定义。该函数将传入的整型参数x压入栈中,即在size小于数组的最大下标情况下, size自加1,再给x赋值。请在注释“//**3**”之后添加适当的语句。

(4)完成类stack的成员函数pop的定义,该函数返回栈顶元素的值,即在size不等于-1的情况下,返回数组中下标为size的元素的值,并将size减1。请在注释“//**4**”之后添加适当的语句。

程序输出结果如下:

the top elem:1

the pop elem:1

the stack is empty

注意:除在指定位置添加语句之外,请不要改动程序中的其他内容。

源程序文件test34_3.cpp清单如下:

include<iostream.h>

class stack

{

//** 1 **

public:

stack ( );

bool empty(){return size==-1;}

bool full() {return size==99;}

void push(int x);

void pop();

void top();

};

stack::stack()

{

//** 2 **

for(int i=0; i<100; i++)

*(sp+i)=0;

size=-1;

}

void stack::push(int x)

{

//** 3 **

cout<<"the stack is full"<<end1;

else

{

size++;

*(sp+size) = x;

}

}

void stack::pop()

{

//** 4 **

cout<<"the stack is empty"<<end1;

else

{

cout<<"the pop elem:"<<*(sp+size)<<end1;

size--;

}

}

void stack::top()

{

if iempty() )

cout<<"the stack is empty"<<end1;

else

{

cout<<"the top elem:"<<*(sp+size)<<end1;

}

}

void main ( )

{

stack s;

s.push(1);

s.top();

s.pop();

s.top();

}


正确答案:(1) int *sp; int size; (2) sp=new int[100]; (3) if(full()) (4) if(empty())
(1) int *sp; int size; (2) sp=new int[100]; (3) if(full()) (4) if(empty()) 解析:本题主要考查的是考生利用类、数组、指针和基本控制结构等知识,建立经典数据结构的能力。栈在数据结构中是一应用范围很广的类,在这里实现的只是最核心的部分。在该题中特别注意使用new进行动态空间申请及指针在数组访问中的应用。


阅读以下说明C++代码,将应填入(n)处的字句写在对应栏内。

[说明]

以下程序的功能是实现堆栈的一些基本操作。堆栈类stack共有三个成员函数:empty判断堆栈是否为空;push进行人栈操作;pop进行出栈操作。

[C++程序]

include "stdafx. h"

include <iostream, h>

eonst int maxsize = 6;

class stack {

float data[ maxsize];

int top;

public:

stuck(void);

~ stack(void);

bool empty(void);

void push(float a);

float pop(void);

};

stack: :stack(void)

{ top =0;

cout < < "stack initialized." < < endl;

}

stack:: ~stack(void) {

cout < <" stack destoryed." < < endl;

bool stack:: empty (void) {

return (1);

void stack: :push(float a)

if(top= =maxsize) {

cout < < "Stack is full!" < < endl;

return;

data[top] =a;

(2);

}

float stack:: pop (void)

{ if((3)){

cout< < "Stack is undcrflow !" < < endl;

return 0;

(4);

return (5);

}

void main( )

{ stack s;

coat < < "now push the data:";

for(inti=l;i< =maxsize;i+ +) {

cout< <i< <" ";

s. push(i);

}

coat < < endl;

cout< < "now pop the data:";

for(i = 1 ;i < = maxsize ;i + + )

cout< <s. pop()< <" ";

}


正确答案:(1)top==0? true:false (2)top++(或者top =top+1)(3)top==0 (4)top--(或者top =top-1) (5)data[top]
(1)top==0? true:false (2)top++(或者top =top+1)(3)top==0 (4)top--(或者top =top-1) (5)data[top] 解析:(1)判断堆栈是否为空的条件是top为0,而且本函数的返回值为布尔类型,故此处应该填写top==0? true:false;
(2)数据入栈后,栈顶指针要向上移动一个单元;
(3)top为0说明堆栈已经空了,此处if语句返回堆栈为空的提示;
(4)先将栈顶指针往下移动一个单元,才可以指向要出栈的数据;
(5)本行代码的功能是返回要出栈的数据。

更多 “中国长城计算机深圳股份有限公司2月招聘面试题117道2020215” 相关考题
考题 栈(Stack)是限定仅在(18)进入插入或删除操作的线性表。对栈来说,表尾端称为(18);表头端称为(18)。A.表头 栈顶(top),栈底(bottom)B.表头,栈底(bottom)栈顶(top)C.表尾,栈顶(top)栈底(bottom)D.表尾,栈底(bottom)栈顶(top)正确答案:C解析:此题考察对栈(Stack)定义的理解。

考题 使用VC6打开考生文件夹下的工程MyProj8。此工程包含一个源程序文件MyMain8.cpp,该程序实现栈的入栈和出栈的操作。其中有两个类:一个是节点类node,它包含节点值和指向上一个节点的指针prey;另一个类是栈类stack,它包含栈的头指针top。但类的定义并不完整。请按要求完成下列操作,将类Sample的定义补充完成:①定义私有节点值data,它是血型的数据,以及定义一个指向上一个节点的指针prev。请在注释“//* *1* *”之后添加适当的语句。②完成构造函数node(int d,node*n)的定义,使得私有成员data和prev分别初始化为d和n。请在注释“//* *2* *”之后添加适当的语句。③完成类stack的成员函数push(int i)的类体内的定义。函数push()实现入栈这个操作,即把形参i压入栈中,那么此时应该创建一个新的节点,并让这个节点的prev指针指向栈顶。请在注释“//* *3 * *”之后添加适当的语句。注意:除在指定位置添加语句之外,请不要改动程序中的其他内容。源程序文件MyMain8.cpp清单如下://MyMain 8.cppinclude <iostream>using namespace std;class stack;class node{private://* * 1 * *public:node(int d, node *n){//* * 2 * *}friend class stack;};class stack{node *top; //栈头public:stack(){top=0;}void push(int i){//* * 3 * *}int pop(){node*t=top;if(top){top=top->prev;int c=t->data;delete t;return c;}return 0;}};int main(){stack s;s.push(6);s.push(3);s.push(1);return 0;}正确答案:

考题 以下程序实现栈的入栈和出栈的操作。其中有两个类:一个是节点类node,它包含点值和指向上一个节点的指针 prev;另一个类是栈类 stack, 它包含栈的头指针 top。生成的链式栈如下图所示。〈IMG nClick=over(this) title=放大 src="tp/jsj/2jc++j28.1.gif"〉下面是实现程序,请填空完成此程序。include 〈iostream〉using namespace std;class stack;class node{int data;node *prev;public:node(int d, node *n){data=d;prev=n;}friend class stack;};class stack{node *top; //栈头public:stack(){top=0;}void push(int i){node *n=【 】;top=n;}int pop(){node *t=top;if (top){top=top-〉prev;int c= t-〉data;delete t;return c;}return 0;}int main (){stack s;s.push(6);s.push(3);s.push (1);return 0;}正确答案:new node(itop)new node(i,top) 解析:本题考核友元类以及对象成员的应用,属于综合考题。本程序中定义了两个类node和stack,用于实现堆栈的压入和弹出操作。其中,类 stack是类node的友元类,这样类stack中的成员可以访问类node中的所有成员。在类node中,定义两个私有变量:整型变量data和对象指针prev。变量data用于保存节点的数值,而对象指针prey用于指向上一节点。在类node的构造函数中,形参是数据d和对象指针n。在类stack中,定义了一个私有变量,栈顶指针top,并在构造函数中赋值0(即指针为空)。 函数push()实现入栈操作,即把形参i压入栈中,那么此时应该创建一个新的节点,并让这个节点的prev指针指向栈顶,即top。然后让top指针指向新的节点。所以在push()函数中应填入“node*n=new node(i,top)”。类stack中的pop()函数实现数据的弹出功能。先定义了一个对象指针t指向栈顶节点。然后判断堆栈是否为空,如果为空,则返回0,否则就弹出栈顶节点的值。那么应该先将栈顶指针后退一个节点,然后把对象t指针指向的节点值弹出,并删除节点t。

考题 阅读下列函数说明和C函数,将应填入(n)处的字句写在对应栏内。[说明]用链式存储结构实现的栈称为链栈。若链栈元素的数据类型为datatype,以LinkStack记链栈结构,其类型定义为:typedef struct node{ datatype data;stmct node * next;} StackNode, * LinkStack;由于栈的主要操作都是在栈顶进行的,因此我们把链表的头部作为栈顶。设top为栈顶指针,即:LinkStack top。下面各函数的功能说明如下:(1)LinkStack Init_LinkStack():建立并返回空的链栈;(2)int Empty_LinkStack(LinkStack top):判断top所指链栈是否空;(3)LinkStack Push_LinkStack(LinkStacktop,datatypex):将数据x压人top所指链栈的栈顶,返回新栈指针;(4)LinkStack Pop_LinkStack (LinkStacktop, datatype*x):弹出top所指链栈的栈顶元素x,返回新栈指针。[函数]LinkStaek Init_LinkStack( ){ returnNULL;int Empty_LinkStack ( LinkStaek top)if(top = = NULL) return 1;else return 0;LinkStaek Push_LinkStaek( LinkStaektop, datatype X){ StaekNode *s;s=malloc (sizeof(StaekNode) );(1)= x;(2)= top;(3);return top;}LinkStaek Pop_LinkStack (LinkStacktop, datatype * x){ StaekNode *p;if(top = = NULL) return NULL;else{* x =(4);p = top;(5);free (p);return top;}}正确答案:(1)s->data (2)s->next (3)top=s (4)top->data (5)top=top->next(1)s->data (2)s->next (3)top=s (4)top->data (5)top=top->next 解析:(1)~(3):LinkStack Push_LinkStack(Link- Stacktop,datmype x)函数的功能是将x压入栈顶,因此首先为其创建一个节点s,使s->data等于x,使s-> next指向原来的栈顶top,最后将,作为新栈的栈顶并返回。(4)~(5):LinkStack Pop_LinkStaek(LinkStacktop, datatype*x)的功能是弹出原栈顶元素,返回这个元素以及新栈的指针。当原链栈不空时,取出栈顶元素top ->data赋给参量*x作为返回值,将top->next更新为新栈的栈顶,并且释放原来top节点的空间。

考题 单选题向一个顺序栈S(栈顶指针为top)中插入元素x时,首先要()。A S->stack[S->top]=xB S->top++C S->top--D x=S->stack[S->top]正确答案:A解析:暂无解析

考题 试题七(共 15 分)阅读以下说明和C程序,将应填入 (n) 处的字句写在答题纸的对应栏内。【说明】现有 n(n < 1000)节火车车厢,顺序编号为 1,2,3,...,n,按编号连续依次从 A方向的铁轨驶入,从 B 方向铁轨驶出,一旦车厢进入车站(Station)就不能再回到 A方向的铁轨上;一旦车厢驶入 B 方向铁轨就不能再回到车站,如图 7-1所示,其中 Station 为栈结构,初始为空且最多能停放 1000 节车厢。下面的 C 程序判断能否从 B 方向驶出预先指定的车厢序列,程序中使用了栈类STACK,关于栈基本操作的函数原型说明如下:void InitStack(STACK *s):初始化栈。void Push(STACK *s,int e): 将一个整数压栈,栈中元素数目增 1。void Pop(STACK *s):栈顶元素出栈,栈中元素数目减 1。int Top(STACK s):返回非空栈的栈顶元素值,栈中元素数目不变。int IsEmpty(STACK s):若是空栈则返回 1,否则返回 0。【C 程序】include<stdio.h>/*此处为栈类型及其基本操作的定义,省略*/int main( ){STACK station;int state[1000];int n; /*车厢数*/int begin, i, j, maxNo; /*maxNo 为 A端正待入栈的车厢编号*/printf("请输入车厢数: ");scanf("%d",&n);printf("请输入需要判断的车厢编号序列(以空格分隔) : ");if (n < 1) return -1;for (i = 0; i<n; i++) /* 读入需要驶出的车厢编号序列,存入数组 state[] */scanf("%d",&state[i]);(1) ; /*初始化栈*/maxNo = 1;for(i = 0; i < n; ){/*检查输出序列中的每个车厢号 state[i]是否能从栈中获取*/if ( (2) ){/*当栈不为空时*/if (state[i] == Top(station)){ /*栈顶车厢号等于被检查车厢号*/printf("%d ",Top(station));Pop(&station); i++;}elseif ( (3) ){printf("error\n");return 1;}else {begin = (4) ;for(j = begin+1; j<=state[i]; j++) {Push(&station, j);}}}else { /*当栈为空时*/begin = maxNo;for(j = begin; j<=state[i]; j++){Push(&station, j);}maxNo = (5) ;}}printf("OK");return 0;}正确答案:试题七 分析  本题考查栈数据结构的应用和C程序设计基本能力。  栈的运算特点是后进先出。在本题中,入栈序列为1、2、…、n-1、n,出栈序列保存在state[]数组中,state[0]记录出栈序列的第1个元素,state[1]记录出栈序列的第2个元素,依此类推。程序采用模拟元素入栈和出栈的操作过程来判断出栈序列是否恰当。需要注意的是,对于栈,应用时不一定是所有元素先入栈后,再逐个进行出栈操作,也不一定是进入一个元素紧接着就出来一个元素,而是栈不满且输入序列还有元素待进入就可以进栈,只要栈不空,栈顶元素就可以出栈,从而使得唯一的一个入栈序列可以得到多个出栈序列。当然,在栈中有多个元素时,只能让栈顶的元素先出栈,栈中其他的元素能从顶到底逐个出栈。本题中入栈序列和出栈序列的元素为车厢号。  空(1)处对栈进行初始化,根据题干中关于栈基本操作的说明,调用InitStack初始化栈,由于形参是指针参数,因此实参应为地址量,即应填入“Initstack(&station)”。  当栈不空时,就可以令栈顶车厢出栈,空(2)处应填入“!IsEmpty(station)”。  栈顶车厢号以Top(station)表示,若栈顶车厢号等于出栈序列的当前车厢号state[i],说明截至到目前为止,出栈子序列state[0]~state[i]可经过栈运算获得。由于进栈时小编号的车厢先于大编号的车厢进入栈中,因此若栈顶车厢号大于出栈序列的当前车厢号state[i],则对于state[i]记录的车厢,若它还在栈中,则此时无法出栈,因为它不在栈顶,所以出错,若它已先于当前的栈顶车厢出栈,则与目前的出栈序列不匹配,仍然出错,因此空(3)处应填入“state[i]<Top(station)”。  若栈顶车厢号小于出栈序列的当前车厢号state[i],则说明state[i]记录的车厢还没有进入栈中,因此从入栈序列(A端)正待进入的车厢(即比栈顶车厢号正好大l)开始,直到state[i]记录的车厢号为止,这些车厢应依次进入栈中。程序中用以下代码实现此操作:  for(j=begin+1;j<=state[i];j++){  Push(&station,j);  }  显然,begin应获取栈顶车厢号的值,即空(4)处应填入“Top(station)”。  还有一种情况,就是待考查的出栈序列还没有结束而栈空了,则说明需要处理入栈序列,使其车厢入栈。程序中用maxNO表示A端正待入栈的车厢编号,相应的处理如下面代码所示:  begin=maxNO;  for(j=begin;j<=state[i];j++){  Push(&station,j);  }  接下来,A端正待入栈的车厢编号等于j或state[i]+1,即空(5)处应填入j或“state[i]+1”。  如果驶出的车厢编号序列是经由栈获得的,则程序运行时输出该序列及字符串“OK”否则输出“error”而结束。试题七 参考答案(共15分,各3分)(1)InitStack(&station)(2)!IsEmpty(station)(3)state[i]Top(station)(4)Top(station)(5)j

考题 试题四(共 15 分)阅读以下说明和 C 函数,将应填入 (n) 处的字句写在答题纸的对应栏内。[说明]计算机在处理算术表达式时,首先将其转换为后缀表达式。例如,表达式“46+5*(120-37)”的后缀表达式形式为“46 5 120 37 - * +” 。计算后缀表达式时,从左至右扫描后缀表达式:若遇到运算对象,则压入栈中;遇到运算符,则从栈中弹出相关运算对象进行计算,并将运算结果压入栈中,重复以上过程,直到后缀表达式扫描结束。例如,后缀表达式“46 5 120 37 - * +”的计算过程为:a. 依次将 46、5、120、37 压入栈中;b. 遇到“-”,取出 37、120,计算 120–37,得 83,将其压入栈中;c. 遇到“*”,取出 83、5,计算 5*83,得 415,将其压入栈中;d. 遇到“+”,取出 415、46,计算 46+415,得 461,将其压入栈中;e. 表达式结束,则计算过程完成。函数 computing(char expr[],int *result)的功能是基于栈计算后缀形式的表达式(以串形式存入字符数组 expr)的值,并通过参数 result 返回该值。函数的返回值为-1/0 分别表示表达式有/无错误。假设表达式中仅包含数字、空格和算术运算符号,其中所有项均以空格分隔,且运算符仅包含加(“+”)、减(“-”)、乘(“*”)、除(“\”)。函数 computing 中所用栈的基本操作的函数原型说明如下:void InitStack(STACK *s):初始化栈。void Push(STACK *s, int e): 将一个整数压栈,栈中元素数目增 1。void Pop(STACK *s):栈顶元素出栈,栈中元素数目减 1。int Top(STACK s):返回非空栈的栈顶元素值,栈中元素数目不变。int IsEmpty(STACK s):若s 是空栈,则返回1 否则返回 0。[C 函数]int computing(char expr[], int *result){STACK s; int tnum, a,b; char *ptr;InitStack(&s);ptr = expr; /*字符指针指向后缀表达式串的第一个字符*/while (*ptr!='\0') {if (*ptr==' ') { /*当前字符是空格*/(1) ; /*字符指针指向下一字符*/continue;}elseif (isdigit(*ptr)) {/*当前字符是数字,则将该数字开始的数字串转换为数值*/tnum = (2) ;while (*ptr>=’0’ && *ptr <=’9’) {tnum = tnum * 10 + (3) ;ptr++;}Push( (4) );}else /*当前字符是运算符或其他符号*/if (*ptr=='+'||*ptr=='-'||*ptr =='*'||*ptr =='/'){if (!IsEmpty(s)) {a = Top(s); Pop(&s); /*取运算符的第二个运算数*/if (!IsEmpty(s)) {b = Top(s); Pop(&s); /*取运算符的第一个运算数*/}else return -1;}else return -1;switch (*ptr) {case '+': Push(&s,b+a); break;case '-': Push(&s,b-a); break;case '*': Push(&s,b*a); break;case '/': Push(&s,b/a); break;}}elsereturn -1;ptr++; /*字符指针指向下一字符*/} /* while */if (IsEmpty(s)) return -1;else {(5) = Top(s); Pop(&s); /*取运算结果*/if (!IsEmpty(s)) return -1;return 0;}}正确答案:

考题 请将下列栈类Stack的横线处补充完整。class Stack{private:int pList[100]; ∥int数组,用于存放栈的元素int top; ∥栈顶元素(数组下标)public:Stack():top(0){}void Push(const int &item); ∥新元素item正确答案:pList[top]=itempList[top]=item 解析: 此题考查的是堆栈数据结构。堆栈是一种先进后出的队列,每次入栈在栈顶,出栈也在栈顶。当栈顶指针所指位置是最后一个有效数据时,下次出栈直接取出栈顶指针所指数据,然后栈顶指针再减1;入栈时需要将栈顶指针先增1,然后将数据存入栈顶指针所指位置。本题中,从Pop()数中可以看出,是先取数然后top才会减1,Push()函数应先增1再取数。所以应填入pList[top]=item。

考题 下面是一个栈类的模板,其中push函数将元素i压入栈顶,pop函数弹出栈顶元素。栈初始为空,top值为0,栈顶元素在stack[top-1]中,在下面横线处填上适当的语句,完成栈类模板的定义。template<class t>class Tstack{enum{size=1000};T stack[size]int top;public:Tsack():top(0){}void push(const T&i){if(top<size)stack[top++]=i;}T pop(){if(top==O)exit(1);//栈空时终止运行retum【 】;}};正确答案:stack[--top]stack[--top] 解析:++/--运算符;注意栈顶元素在stack[top-1]中。

考题 向一个顺序栈S(栈顶指针为top)中插入元素x时,首先要()。A、S->stack[S->top]=xB、S->top++C、S->top--D、x=S->stack[S->top]正确答案:B