[C++面試題]之迴圈鏈表、隊列、棧和堆(在csdn上看到一道面試題—求解啊)

來源:互聯網
上載者:User
文章目錄
  • 1、已知n個人(以編號1,2,3,...,n分別表示)圍坐在一張圓桌周圍,從編號為k的人開始報數,數到m的那個人出列,他的下一個人又從k開始報數,數到m的那個人出列,依次重複下去,直到圓桌的人全部出列。試用C++編寫實現。
  • 2、編程實現隊列的入隊/出隊操作。
  • 3、用兩個棧實現一個隊列的功能,請用C++實現。
  • 4、請講訴heap和stack的差別。
  • 5、今天在csdn上看到一道面試題
1、已知n個人(以編號1,2,3,...,n分別表示)圍坐在一張圓桌周圍,從編號為k的人開始報數,數到m的那個人出列,他的下一個人又從k開始報數,數到m的那個人出列,依次重複下去,直到圓桌的人全部出列。試用C++編寫實現。

    解析:本題就是約瑟夫環問題的實際情境,要通過輸入n、m、k三個正整數,求出列的序列。這個問題採用的是典型的迴圈鏈表的資料結構,就是將一個鏈表的尾元素指標指向隊首元素:

    p->link=head;

    解決問題的核心步驟如下:

    (1)建立一個具有n個鏈節點、無前端節點的迴圈鏈表。

    (2)確定第一個報數人的位置。

    (3)不斷的從鏈表中刪除鏈節點,直到鏈表為空白。

    答案:

#include<iostream>using namespace std;typedef struct LNode{int data;struct LNode *link;}LNode,*LinkList;//n為總人數,k為第一個開始報數的人,m為出列者喊到的數void JOSEPHUS(int n,int k,int m){//p為當前節點,r為輔助節點,指向p的前驅節點,list為前端節點LinkList p,r,list,curr;//簡曆迴圈鏈表p=(LinkList)malloc(sizeof(LNode));p->data=1;p->link=p;curr=p;for(int i=2;i<=n;i++){LinkList t=(LinkList)malloc(sizeof(LNode));t->data=i;t->link=curr->link;curr->link=t;curr=t;}//把當前指標移動到第一個報數的人r=curr;while(k--)r=p,p=p->link;while(n--){for(int s=m-1;s--;r=p,p=p->link);r->link=p->link;printf("%d->",p->data);free(p);p=r->link;}}

 

2、編程實現隊列的入隊/出隊操作。

    答案:

#include<iostream>using namespace std;typedef struct student{int data;struct student *next;}node;typedef struct linkqueue{node *first,*rear;}queue;//隊列的入隊queue *insert(queue *HQ,int x){node *s;s=(node *)malloc(sizeof(node));s->data=x;s->next=NULL;if(HQ->rear==NULL){HQ->first=s;HQ->rear=s;}else{HQ->rear->next=s;HQ->rear=s;}return (HQ);}//隊列的出隊queue *remove(queue *HQ){node *p;if(HQ->first==NULL)printf("\n yichu");else{p=HQ->first;if(HQ->first==HQ->rear){HQ->first=NULL;HQ->rear=NULL;}else{HQ->first=HQ->first->next;free(p);}return (HQ);}}

 

3、用兩個棧實現一個隊列的功能,請用C++實現。

    解析:思路如下:

    假設兩個棧A和B,且都為空白。

    可以認為棧A提供入隊列的功能,棧B提供出隊列的功能。

    入隊列:入棧A。

    出隊列:

    (1)如果棧B不為空白,直接彈出棧B的資料。

    (2)如果棧B為空白,則依次彈出棧A的資料,放入棧B中,再彈出棧B的資料。

    答案:

#include<iostream>#include<stack>using namespace std;template<class T>struct Queue{void push(T &t){s1.push(t);}T front(){if(s2.empty()){if(s1.size()==0)throw;while(!s1.empty()){s2.push(s1.top());s1.pop();}}return s2.top();}void pop(){if(s2.empty()){while(!s1.empty()){s2.push(s1.top());s1.pop();}}if(!s2.empty())s2.pop();}stack<T> s1;stack<T> s2;}

 

4、請講訴heap和stack的差別。

    解析:在進行C/C++編程時,需要程式員對記憶體的瞭解比較精準。經常需要操作的記憶體可分為以下幾個類別:

    (1)棧區(stack):由編譯器自動分配和釋放,存放函數的參數值、局部變數的值等。其操作方式類似於資料結構中的棧。

    (2)堆區(heap):一般由程式員分配和釋放,若程式員不釋放,程式結束時可能由作業系統回收。注意它與資料結構中的堆是兩回事,分配方式倒是類似於鏈表

    (3)全域區(靜態區)(static):全域變數和靜態變數的儲存是放在一塊的,初始化的全域變數和靜態變數在一塊地區,未初始化的全域變數和靜態變數在相鄰的另一塊地區。程式結束後由系統釋放。

    (4)文字常量區:常量字串就是放在這裡的,程式結束後由系統釋放。

    (5)程式碼區:存放函數體的二進位代碼。

 

   答案:

(1)stack的空間由作業系統自動分配/釋放,heap上的空間手動分配/釋放。

(2)stack空間有限,heap是很大的自由儲存區。

(3)C中的malloc函數分配記憶體空間即在堆上,C++中對應的是new操作符。

(4)程式在編譯期對變數和函數分配記憶體都在棧上進行,且程式運行過程中函數調用時參數的傳遞也在棧上進行。

 

 

5、今天在csdn上看到一道面試題

     給定方法簽名:

MoveSubArrayToTheEnd(int[] array, int numberOfElements) 

 

            傳入一個數組如 {1,2,3,4,5,6,7} 
            將數組前面 head的一個子集移到數組末尾end
            如:input numberOfElements=3,則{1,2,3,4,5,6,7}=>{4,5,6,7,1,2,3} 
                 input numberOfElements=5,則{1,2,3,4,5,6,7}=>{6,7,1,2,3,4,5}  
            請不要使用FCL提供的類庫函數..

 

      在這裡也請教各位大大,如何寫出演算法..

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.