棧的操作我相信大家都應(yīng)該了解了弄懂了,? 如果沒弄懂希望可以去再去看看相關(guān)的資料,我博客中的C語言中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式中涉及到了一下棧的基本操作,有興趣的朋友也可以看看。
所謂共享?xiàng)#褪莾蓚€(gè)棧共同使用一塊內(nèi)存空間,其中一個(gè)棧的棧底作為另一個(gè)棧的棧頂,反之亦然。
## 開始
### 思路分析
>因?yàn)閮蓚€(gè)棧公用一個(gè)空間,假設(shè)一個(gè)棧為0#,規(guī)定其為空時(shí)top[0]==-1;另一個(gè)棧為1#規(guī)定其為空時(shí),top[1]==MaxSize;
>入棧時(shí),先確定棧號是否合法,然后查看是對0#棧還是1#棧進(jìn)行操作,入棧操作和順序棧的入棧操作并無太大不同。
>選定之后進(jìn)行入棧操作。這里應(yīng)該注意此共享?xiàng)J欠褚褲M,如果已滿則不能進(jìn)行入棧操作。如若入棧成功則返回0;入棧失敗則返回-1;
>出棧時(shí),先確定棧號是否合法,然后查看是對0#棧還是1#棧進(jìn)行操作,出棧操作和順序棧的出棧操作并無太大不同。
>選定之后進(jìn)行出棧操作。如果出棧成功返回0;出棧失敗返回-1;
### 添加適當(dāng)?shù)念^文件,定義一個(gè)棧數(shù)據(jù)結(jié)構(gòu),
共享?xiàng)R彩菞#徊贿^有點(diǎn)特殊,在這里我們還是需要添加適當(dāng)?shù)念^文件和定義恰當(dāng)?shù)臄?shù)據(jù)結(jié)構(gòu)
```c
#include
#include
#defineMaxSize100
typedefintElemType;
typedefstruct{
ElemType data[MaxSize];
int top[2];
}SqStack;
```
### 初始化共享?xiàng)?/p>
由于我這里用的是順序存儲結(jié)構(gòu)的棧結(jié)構(gòu)(也就是數(shù)據(jù)),top也就是一個(gè)標(biāo)記而已,分別代編棧1和棧2的標(biāo)記
```c
voidInitStack(SqStack *s)
{
s->top[0] = -1;
s->top[1] = MaxSize;
}
```
### 入棧操作
在入棧的時(shí)候,我們需要選擇入的是兩個(gè)棧中的哪一個(gè)棧,我們這里用0和1來區(qū)分
```c
intPush(SqStack*s, ElemType x, int n)
{
if (n < 0 || n>1) {
printf("The stack number is false!\n");
return -1;
}
if (s->top[1] - s->top[0] == 1) {
printf("The stack is full!\n");
return -1;
}
switch (n) {
case 0:s->data[++s->top[0]] = x; break;
case 1:s->data[--s->top[1]] = x; break;
}
return 0;
}
```
### 出棧操作
出棧和入棧一樣,也需要選擇出棧的具體是哪個(gè)棧
```c
intPop(SqStack*s, ElemType*x, int n)
{
if (n < 0 || n>1) {
printf("The stack number is false!\n");
return -1;
}
switch (n) {
case 0:
if (s->top[0] == -1) {
printf("The stack[0] is empty!\n");
}
*x = s->data[s->top[0]--];
break;
case 1:
if (s->top[1] == MaxSize) {
printf("The stack[1] is empty!\n");
}
*x = s->data[s->top[1]++];
break;
}
return 0;
}
```
### 主函數(shù)
```c
intmain(intargc,char*argv[])
{
SqStack s;
InitStack(&s);
ElemType x = 5;
int n = 0;
int flagPush;
flagPush = Push(&s, x, n);
if (flagPush) {
printf("Push false!\n");
}
else {
printf("Push %d success!\n", x);
}
int flagPop;
flagPop = Pop(&s, &x, n);
if (flagPop) {
printf("Pop false!\n");
}
else {
printf("Pop %d? success!\n", x);
}
return 0;
}
```
### 運(yùn)行結(jié)果

以上就是共享?xiàng)5暮唵尾僮鳎疫@里只測試他是否能夠成功,如有需要,請研讀代碼后自行修改,如果一時(shí)看不懂,請多看幾遍思路分析,把原理弄懂,代碼還是想當(dāng)簡單的。
>注:
>-上述代碼在**visual studio 2015**中編譯成功運(yùn)行,其他ide請自行測試
>-上述文字皆為個(gè)人看法,如有錯(cuò)誤或建議請及時(shí)聯(lián)系我