資料結構 棧和佇列及其面試題

2021-08-21 08:22:09 字數 4404 閱讀 9977

1. 利用順序表實現棧

函式介面:

typedef int sdatatype;

typedef struct stack stack;

// 初始化

void stackinit(stack *pstack);

// 壓棧

void stackpush(stack *pstack, sdatatype data);

// 出棧

void stackpop(stack *pstack);

// 返回棧頂元素

sdatatype stacktop(stack *pstack);

// 判斷是否為空

// 1 空

// 0 不空

int stackisempty(stack *pstack);

// 返回資料個數

int stacksize(stack *pstack);

2. 利用單鏈表實現佇列

函式介面:

typedef int qdatatype;

typedef struct qnode qnode;

typedef struct queue queue;

// 初始化

void queueinit(queue *pqueue);

// 入佇列

void queuepush(queue *pqueue, qdatatype data);

// 出佇列

void queuepop(queue *pqueue);

// 返回隊首元素

qdatatype queuefront(queue *pqueue);

// 判斷是否為空

// 1 空

// 0 不空

int queueisempty(queue *pqueue);

// 返回資料個數

int queuesize(queue *pqueue);

#pragma once

#include#include#includetypedef int qdatatype;

typedef struct qnode qnode;

typedef struct queue queue;

// 初始化

void queueinit(queue *pqueue)

// 入佇列

void queuepush(queue *pqueue, qdatatype data)

pqueue->prear->pnext = pnewnode;

pqueue->prear = pnewnode;

}// 出佇列

void queuepop(queue *pqueue)

}// 返回隊首元素

qdatatype queuefront(queue *pqueue)

// 判斷是否為空

// 1 空

// 0 不空

int queueisempty(queue *pqueue)

// 返回資料個數

int queuesize(queue *pqueue)

void print2(queue *pqueue)

printf("\n");

}void testqueue()

3. 棧與佇列面試題

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

2) 使用兩個棧實現乙個佇列

3) 使用兩個佇列實現乙個棧

4) 元素出棧、入棧順序的合法性。如入棧的序列(1,2,3,4,5),出棧序列為 (4,5,3,2,1)

5) 乙個陣列實現兩個棧(共享棧) 

#pragma once

typedef void* sdatatype;

#include#include#includetypedef struct stack stack;

// 初始化

void stackinit(stack *pstack)

void stackdestroy(stack *pstack)

// 壓棧

void stackpush(stack *pstack, sdatatype data)

}// 出棧

void stackpop(stack *pstack)

}// 返回棧頂元素

sdatatype stacktop(stack *pstack)

}// 判斷是否為空

// 1 空

// 0 不空

int stackisempty(stack *pstack)

// 返回資料個數

int stacksize(stack *pstack)

void print1(stack *pstack)//列印棧

printf("\n");

}void teststack()

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

/*typedef struct minstack minstack;*/

typedef struct minstackminstack;

void init(minstack *pstack)

void push(minstack *pstack, int data)

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

pstack->array[pstack->top++] = min;

/*if (pstack->top2 != 0 && pstack->array2[pstack->top2-1] < data)

pstack->array1[pstack->top1++] = data;

pstack->array2[pstack->top2++] = min;*/

}void pop(minstack *pstack)

int top(minstack *pstack)

int min(minstack *pstack)

void testminstack()

; init(&minstack);

int i = 0;

for (; i < sizeof(array) / sizeof(array[0]); i++)

for (; i < sizeof(array) / sizeof(array[0]); i++)

}//使用兩個棧實現乙個佇列

typedef struct squeuesqueue;

void sinit(squeue *ps)

void spush(squeue *ps, sdatatype data)

void spop(squeue *ps)

} stackpop(p2);

}sdatatype sfront(squeue *ps)

} return stacktop(p2);

}//使用兩個佇列實現乙個棧

#include "queue.h"

typedef struct qstack

qstack;

void qinit(qstack *psd)

void qpush(qstack *psd, sdatatype data)

void qpop(qstack *psd)

queuepop(pq);

}qdatatype stop(qstack *psd)

data = queuefront(pq);

queuepop(pq);

queuepush(pq, data);

return data;

}

#pragma once

#include//1. 兩個陣列實現

//2. 不再每次都入最小棧

typedef struct minstack

minstack;

void init(minstack *ps)

void push(minstack *ps,int data)

}void pop(minstack *ps)

ps->top1--;

}int top(minstack *ps)

int min(minstack *ps)

void test()

; init(&minstack);

int i = 0;

for (; i < sizeof(array) / sizeof(array[0]); i++)

for (; i < sizeof(array) / sizeof(array[0]); i++)

}

資料結構之棧和佇列的經典面試題

在這個題目中要求要返回乙個棧裡面的最小值。有兩種方法 1 用兩個棧,乙個棧存入棧的資料,另乙個棧存對應的最小值,如果入棧的順序為5,8,1,3,4,則存最小值的那個棧存入的資料應該為5,5,1,1,1。2 與上邊一樣,用兩個棧,乙個放資料,另乙個放最小值,最小值由結構體組成有兩部分乙個是資料元素da...

棧和佇列面試題

遞迴反轉乙個棧 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...