棧和佇列面試題

2021-08-30 13:46:51 字數 4151 閱讀 4021

採用順序棧實現棧基本操作;

採用鏈式佇列實現佇列基本操作;

#define maxsize100;

typedef int sdatatype;

typedef struct stack

stack;

typedef struct minstack

minstack;

void stackinit(stack *s)

void stackpush(stack *s,sdatatype data)

s->array[s->top++] = data;

}void stackpop(stack *s)

ps->top--;

}int stackempty(stack *s)

int stacktop(stack *s)

int stacksize(stack *s)

一、實現乙個棧,要求push(入棧),pop(出棧),min(返回最小值)的時間複雜度為o(1),假設有min棧、data棧。

(1)入棧:將資料壓入data棧中,如果min棧為空或者該資料小於min棧棧頂元素,同時壓入min棧中。

(2)出棧:檢測data棧頂元素與min棧頂元素是否相同,若相同,min棧頂元素與data棧頂元素同時出棧,若不相同,只有data棧頂元素出棧。

void minstackinit(minstack *ms)

void minstackpush(minstack *ms,sdatatype data)

}void minstackpop(minstack *ms)

stackpop(&ms->data);

}void minstackempty(minstack *ms)

sdatatype minstacktop(minstack *ms)

sdatatype minstackmin(minstack *ms)

int minstacksize(minstack *s)

二、使用兩個棧實現乙個佇列。stack1棧頂:佇列隊尾 stack2棧頂:佇列隊頭 。

(1)入隊,直接對stack1壓棧。

(2)出隊:檢測stack2是否有資料。

step1:stack2有元素,直接彈出。

step2:stack2沒有元素,將stack1資料「倒入」stack2,轉到step1。

(3) 取隊頭元素:取stack2棧頂元素。

step1:stack2有元素,直接彈出。

step2:stack2沒有元素,將stack1資料「倒入」stack2,轉到step1。

(4) 取隊尾元素:取stack1棧頂元素。

step1:stack1有元素,直接彈出。

step2:stack1沒有元素,將stack2資料「倒入」stack1,轉到step1。

typedef struct queueby2stack

queueby2stack;

void queueby2stackinit(queueby2stack *q)

void queueby2stackpush(queueby2stack *q,sdatatype data)

void queueby2stackpop(queueby2stack *q)

} stackpop(&q->s2);

}int queueby2stackempty(queueby2stack *q)

sdatatype queueby2stackfront(queueby2stack *q)

} return stacktop(&q->s2);

}sdatatype queueby2stackback(queueby2stack *q)

} return stacktop(&q->s1);

}int queueby2stacksize(queueby2stack *q)

三、使用兩個佇列實現乙個棧。

(1) 壓棧:檢測那個佇列有資料,將資料放到該佇列。

(2) 出棧:檢測那個佇列有資料,將除隊尾的的資料匯入另乙個佇列中,最後刪除隊尾。

(3) 返回有資料的隊尾節點。(前提是資料在乙個佇列中)

typedef int qdatatype;

typedef struct qlistnode

qlistnode;

typedef struct queue

queue;

qlistnode *buynewnode(qdatatype data)

newnode->data = data;

newnode->next = null;

return newnode;

}void queueinit(queue* q)

void queuepush(queue* q,qdatatype data)

void queuepop(queue* q)

}qdatatype queuefront(queue* q)

qdatatype queueback(queue* q)

int queuesize(queue* q)

int queueempty(queue* q)

////以上為佇列的基本操作;

//以下為兩個佇列實現的棧的操作;

//typedef struct stackby2queue

stackby2queue;

void stackby2queueinit(stackby2queue* s)

void stackby2queuepush(stackby2queue* s,qdatatype data)

else }

void stackby2queuepop(stackby2queue* s)

queuepop(&s->q1);

} else

queuepop(&s->q2); }}

qdatatype stackby2queuetop(stackby2queue *s)

else

}

四、判斷入棧出棧的合法性。

(1)按順序將入棧序列的元素壓入stack中。

(2)比較stack棧頂元素與出棧序列的元素,若相同,則進行(3),若不同則進行(1)。

(3)彈出stack棧頂元素,出棧序列向後移。

(4)此迴圈完成後,判斷stack棧是否為空,若為空,則順序正確,否則是錯誤的。

int inandoutislegal(int *in,int *out,int insz,int outsz)

stack s;

stackinit(&s);

int in_index = 0;

int out_index = 0;

for(;in_index < insz;in_index++) }

if(stacksize(&s))

else

}

五、乙個陣列實現兩個棧,有三種實現方法。

(1)奇偶儲存法。

(2)中點向兩邊逼近。

(3)兩邊向中點逼近。

簡單比較:如果兩個棧的元素個數相差較大(2)(3)效果一樣,(1)的空間利用率較低。我就用第(3)種方法了。

typedef struct sharestack

sharestack;

void sharestackinit(sharestack *s)

void sharestackpush(sharestack *s,sdatatype data,int which)

else }

void sharestackpop(sharestack *s,int which)

else }

sdatatype sharestacktop(sharestack *s,int which)

else }

int sharestacksize(sharestack *s,int which)

else }

int sharestackempty(sharestack *s,int which)

棧和佇列面試題

遞迴反轉乙個棧 void reverse stack s reverse s int tmp2 s.top s.pop reverse s s.push tmp1 reverse s s.push tmp2 遞迴排序乙個棧 void sort stack s sort s int tmp2 s.to...

棧和佇列面試題

1.使用兩個棧,實現乙個佇列。棧 先進後出,且只能從棧頂pop出資料。佇列 先進先出,對頭pop資料,隊尾push資料。如下 include template class myqueue void pop else if stack2.empty private stack stack1 stack...

棧和佇列面試題總結

1.在o 1 時間內實現棧的push pop min操作 分析 push和pop操作都很好做到,但是min操作就沒這麼容易了,首先想到的肯定是設定乙個flag在每次push的時候紀錄下最小值,但是考慮一下如果pop的時候正好pop掉了最小值怎麼辦呢?解決 使用兩個stack,乙個存放資料,另乙個存放...