C語言共享?xiàng)?/h2>

棧的操作我相信大家都應(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í),先確定棧號(hào)是否合法,然后查看是對(duì)0#棧還是1#棧進(jìn)行操作,入棧操作和順序棧的入棧操作并無太大不同。

>選定之后進(jìn)行入棧操作。這里應(yīng)該注意此共享?xiàng)J欠褚褲M,如果已滿則不能進(jìn)行入棧操作。如若入棧成功則返回0;入棧失敗則返回-1;

>出棧時(shí),先確定棧號(hào)是否合法,然后查看是對(duì)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>

由于我這里用的是順序存儲(chǔ)結(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é)果

![c語言共享?xiàng)_\(yùn)行結(jié)果](http://objects.earthchen.cn/C%E8%AF%AD%E8%A8%80%E5%85%B1%E4%BA%AB%E6%A0%88%E7%BB%93%E6%9E%9C.png)

以上就是共享?xiàng)5暮?jiǎn)單操作,我這里只測(cè)試他是否能夠成功,如有需要,請(qǐng)研讀代碼后自行修改,如果一時(shí)看不懂,請(qǐng)多看幾遍思路分析,把原理弄懂,代碼還是想當(dāng)簡(jiǎn)單的。

>注:

>-上述代碼在**visual studio 2015**中編譯成功運(yùn)行,其他ide請(qǐng)自行測(cè)試

>-上述文字皆為個(gè)人看法,如有錯(cuò)誤或建議請(qǐng)及時(shí)聯(lián)系我

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容