題目:設有兩個棧s1,s2都採用順序棧方式,並共享一個存儲區[0,…,maxsize-1],爲了儘量利用空間,減少溢出的可能,可採用棧頂相向、迎面增長的存儲方式。試設計s1,s2,有關入棧和出棧的操作算法。
關鍵字:共享棧+棧頂相向+迎面增長
思路 :
兩個棧共享向量空間,將兩個棧的棧底設在向量兩端,
初始時,s1棧頂指針爲-1,s2棧頂指針爲maxsize。
兩個棧頂指針相鄰時爲棧滿。
兩個棧頂相向、迎面增長,棧頂指針指向棧頂元素。
初始化共享棧:
# define maxsize 100//兩個棧共享順序存儲空間所能達到的最多元素數/最大容量,初始化100
# define elemtp int//假設元素類型爲整形
typedef struct{
elemtp stack[maxsize];//棧空間
int top[2];//top爲兩個棧頂指針
}stk;//stack的縮寫
stk s;//s是如上定義的結構類型變量,爲全局變量
本題關鍵:
兩個棧入棧和退棧時的棧頂指針的計算。
s1(top=-1)棧是通常意義下的棧;
s2(top=maxsize)棧入棧操作時,其棧頂指針左移(減1);
退棧時,棧頂指針右移(加1)
此外,對於所有棧的操作,都要注意“入棧判滿,出棧判空”
(1)入棧操作
int push(int i,elemtp x){
//入棧操作。i爲棧號,i=0表示左邊(下邊)的s1棧,i=1表示右邊(上邊)的s2棧,x是入棧元素
//入棧成功返回1,否則返回 0
if(i<0||i>1){
printf("棧號輸入不對");
exit(0);
}
if(s.top[1]-s.top[0]==1){
printf("棧已滿\n")
return 0;
}
switch(i){
case 0:s.stack[++s.top[0]]=x;return 1;break;
case 1:s.stack[--s.top[1]]=x;return 1;
}
}
(2)退棧操作
elemtp pop(int i){//退棧算法。i代表棧號,i=0時爲s1棧,i=1時爲s2棧。退棧成功返回退棧元素,否則返回-1
if(i<0||i>1){
printf("棧號輸入錯誤\n")
exit(0);
}
switch(i){
case 0:
if(s.top[0]==-1){
printf("棧空\n");
return -1;
}
else
return s.stack[s.top[0]--];
case 1:
if(s.top[1]==maxsize){
printf("棧空\n");
return -1;
}
else
return s.stack[s.top[1]++];
}//switch
}