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...