使用乙個陣列來實現兩個棧結構,即共享棧
對於這個問題,我們有兩種解法
1. 方法一:
定義兩個區間(0,top1],[top2,0),分別表示連個棧的範圍,兩個棧由兩側向中間生長,棧滿的條件為 top1 == top2
2. 方法二:
將陣列從中間平均一分為二,棧由中間向兩側生長
明顯方法一優於方法二,因為方法二可以做到最大程度的利用到陣列的所有空間,沒有浪費,所以這裡我們使用方法一來解決這個問題
這裡我們要用到棧的一些操作,對於棧的概念和操縱還不太理解的可以移步
順序表實現的資料結構棧因為棧不是我們求解這個問題的主要難點,所以選擇了比較簡單的順序棧來做載體,如果想對其他方法實現棧有個深入地了解,可以參考
鍊錶實現的資料結構棧及相關函式
#pragma once
// 引入順序表實現的棧相關函式
#include "seqstack.h"
#define datatype char
typedef struct sharedstack sharedstack;
// 初始化
void sharedstackinit(sharedstack* sharedstack);
// 入棧
void sharedstackpush(sharedstack* sharedstack, int stacknumber, datatype value);
// 出棧
void sharedstackpop(sharedstack* sharedstack, int stacknumber);
// 取棧頂元素
int sharedstacktop(sharedstack* sharedstack, int stacknumber, datatype* value);
.c 實現包含了單元測試模組,可以通過條件編譯將其關閉
#include "sharedstack.h"
// 初始化
void sharedstackinit(sharedstack* sharedstack)
sharedstack->size = 1000;
sharedstack->top1 = 0;
sharedstack->top2 = sharedstack->size;
sharedstack->data = malloc(sizeof(datatype)*sharedstack->size);
}// 入棧
void sharedstackpush(sharedstack* sharedstack, int stacknumber, datatype value)
switch(stacknumber)
sharedstack->data[sharedstack->top1++] = value;
return;
}break;
case
2: sharedstack->data[--sharedstack->top2] = value;
return;
}default:
perror("stacknumber error");
return;
}}// 出棧
void sharedstackpop(sharedstack* sharedstack, int stacknumber)
switch(stacknumber)
sharedstack->top1--;
return;
}break;
case
2: sharedstack->top2++;
return;
}default:
perror("stacknumber error");
return;
}}// 取棧頂元素
int sharedstacktop(sharedstack* sharedstack, int stacknumber, datatype* value)
switch(stacknumber)
*value = sharedstack->data[sharedstack->top1-1];
return
1; }
break;
case
2: *value = sharedstack->data[sharedstack->top2];
return
1; }
default:
perror("stacknumber error");
return
0; }
}#if 0
/* *******************************************
* ******************* test ******************
* *******************************************/
#include
#define function() printf("\n******************** %s ***************===\n\n", __function__)
void print(sharedstack stack, const
char* msg) else
}if(stack.top2 == stack.size) else
}}// 入棧測試
void testpush()
// 出棧測試
void testpop()
// 獲取棧頂元素測試
void testtop()
int main()
#endif
兩個棧實現乙個佇列和兩個佇列實現乙個棧
stack 後進先出 lifo 是在表的一端進行插入或刪除運算的線性表,我們把插入 刪除的這一端稱為棧頂 top 另一端稱為棧底 bottom e push e item 把元素壓入棧頂並返回此元素 e pop 移除棧頂元素並返回此元素 e peek 檢視棧頂元素而不移除它 boolean empt...
兩個棧實現乙個佇列和兩個佇列實現乙個棧
棧的特性 先進後出 filo 佇列的特性 先進先出 fifo 1 兩個棧實現乙個佇列 1 思路 入棧時,直接壓入棧1中 如果棧1滿了,判斷棧2是否為空,若為空,則將棧1元素全部倒入棧2,再入棧 若棧2不為空,則不能再入元素 出棧時,判斷棧2是否為空,若棧為空,則將棧1中的元素倒入棧2,否則直接彈出棧...
兩個棧實現乙個佇列和兩個佇列實現乙個棧
在這裡我們先說明一下,我們在此 中用到的棧和佇列都是stl庫中實現的 思路 兩個棧,stark1和stark2,將stark1作為儲存空間,stark2作為零時快取區。入隊時,將入隊元素全部壓入stark1中即可。出隊時,將stark1中的元素全部pop出來壓入stark2中,然後在全部pop出來就...