採用順序棧實現棧基本操作;
採用鏈式佇列實現佇列基本操作;
#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,乙個存放資料,另乙個存放...