當前位置:首頁 » 操作系統 » 出棧的演算法

出棧的演算法

發布時間: 2023-04-11 12:22:04

① 1,2,3,4依次進棧,出棧隨時,寫一演算法求出所有可能出棧序列

代碼如下:

#define N 4

int m=0,a=0,b=N;/*m表示種數,a表示棧中元素個數,b表示外面還有需要進棧的個數*/

main()

{

inS(a,b);/*首先入棧*/

printf("%d",m);

getch();

}

int inS(int a,int b)/*入棧*/

{

a++;b--;/*入棧棧中元素+1,棧外元素-1 */

if(b>0)/*若棧外有元素,可以入棧*/

inS(a,b);

if(a>0)/*若棧中有元素,可以出棧*/

outS(a,b);

}

int outS(int a,int b)/*出棧*/

{

a--;/*出棧棧中元素-1*/

if(a==0&&b==0)/*若棧中元素和棧外元素都為0個*/

{

m++;/*則此種情況的序列滿足條件,種數+1*/

return;

}

if(b>0)

inS(a,b);

if(a>0)

outS(a,b);

}

(1)出棧的演算法擴展閱讀

棧的相關知識點:

順序棧內容包含數據和棧頂指針(int),因此採用結構體。

注意:

1、初始時,top指向-1;

2、入棧讓敏橡時,先判斷順序棧是否已滿(判斷條件:top=maxsize-1);如果沒滿,則top++,並將元素值賦給s.top;

3、出棧時,先判斷順序棧是否已拿圓空(判斷條件:top=-1);如果沒空,則先返回棧頂元素,再top- -。

共享棧

兩個順序棧共坦旁享一個一維數組空間,而棧底位置相對不變,兩個棧底分別設為一維數組的兩端。

note:

(1)棧空:top1==-1&&top2==maxsize;

(2)棧滿:top2-top1= 1(此時兩個棧頂指針相鄰);

(3)入棧:S.data[++top1]=x或S.data[–top2]=x;

(4)出棧:x=S.data[top1–]或x=S.data[top2++];

(5)共享棧可以更好的利用存儲空間,整個存儲空間被占滿時發生上溢。

② 棧的運算遵循什麼原則

棧的運算遵循(先進後出、後進先出)的原則。

例如從輸入序列ABCDE中,先將A入棧, 然後接下來是要想辦法讓E先入棧。

首先,將B、C、D、E依次入棧, 這時候棧的輸出序列數E、D、C、B、A,然後將E、D、C、B依次出棧, 現在輸入的序列就是E、D、C、B (這里利用了棧的特點: 輸入的序列經過了入棧出棧後,序列的攜鄭次序會顛倒), 最後E、D、C、B依次入棧, 這時候,輸出序列就是B、C、D、E、A。

(2)出棧的演算法擴展閱讀:

基本演算法

進棧(PUSH)演算法

1、若TOP≥n時,則給出溢出信息,作出錯處理(進棧前首襲伍先檢查棧是否已滿,滿則溢出;不滿則作2)

2、置TOP=TOP+1(棧指針加1,指向進棧地址)

3、S(TOP)=X,結束(X為新進棧的元素)

退棧(POP)演算法

1、若TOP≤0,則給出下溢信息,作出錯處理(退棧前先檢查是否已為空棧, 空則下溢;不空則作2)

2、X=S(TOP),(退棧後拍隱或的元素賦給X)

3、TOP=TOP-1,結束(棧指針減1,指向棧頂)

③ 棧的出棧序列口訣是什麼

出棧的順序規律是排在前面的先出,排在後面的後出。

①若TOP≤0,則給出下溢信息,作出錯處理(退棧虧緩前先檢查是否已為空棧, 空雹空岩則下溢;不空則作②);

②X=S(TOP),(退棧後的元素賦給X):

③TOP=TOP-1,結束(棧指針減1,指向棧頂)。

(3)出棧的演算法擴展閱讀:

棧是允許在同一端進行插入和刪除操作的特殊線性表。允許進行插入和刪除操作的一端稱為棧頂(top),另一端為棧底(bottom);棧底固定,而棧頂浮動;棧中元素個數為零時稱為空棧。插入一般稱為進棧(PUSH),刪除則稱源御為出棧(POP)。棧也稱為後進先出表。

④ 急求 共用堆棧的出棧演算法

class LinkedList //定義雙項鏈表{char data;LinkedList back;LinkedList forward;}interface Access //定義從隊列和棧存取操作的介面{void put(char c);char get();}class Queue implements Access //定義隊列類{private LinkedList QHead=new LinkedList();private LinkedList QRear=QHead; //初始化隊頭和隊尾public void put(char c) //實現向隊列存數的方法{QRear.forward=new LinkedList();QRear.forward.data=c;QRear.forward.back=QRear;QRear=QRear.forward;}public char get() //實現從隊列取數的方法{if(QHead!=QRear) //如果隊列不為空則取數{QHead.forward.back=null;QHead=QHead.forward;return QHead.data;}else{System.out.println("The queue is empty! ");return '\兆虛0';}}}class Stack implements Access //定義棧類{private LinkedList bottom=new LinkedList();private LinkedList top=bottom; //初始化棧頂與斬底public void put(char c) //實現從棧中存數的方法{top.forward=new LinkedList();top.forward.data=c;top.forward.back=top;top=top.forward;}public char get() //實現從棧族蘆燃中取數的方法{if(top!=bottom) //如果棧不為空則取數{char ch=top.data;top.back.forward=null;top=top.back;return ch;}else{System.out.println("The stack is empty! ");return '\0';}}}public class StackQueue{public static void main(String[] args){char ch;Queue q=new Queue(); //創建一個隊列qStack s=new Stack(); //創建一個棧sq.put('x');q.put('y');q.put('z'); //向隊列q存入3個字元s.put('x');s.put('y');s.put('z'); //向棧s存入3個字元System.out.println("Queue: ");if((ch=q.get())!='\0')System.out.println(ch);if((ch=q.get())!='\0')System.out.println(ch);if((ch=q.get())!='\0')System.out.println(ch);if((ch=q.get())!='\0')System.out.println(ch);//從隊列q中取數並顯示System.out.println("Stack: ");if((ch=s.get())!='\0')System.out.println(ch);if((ch=s.get())!='\0')System.out.println(ch);if((ch=s.get())!='\0')System.out.println(ch);if((ch=s.get())!='\0')System.out.println(ch);//從嘩檔棧s中取數並顯示}}引自:http://wenwen.soso.com/z/q104863.htm?ch=w.xg.ll

⑤ 鏈棧的入棧和出棧運算

1、棧(stack)又名堆棧,它是一種運算受限的線性表。其限制是僅允許在表的一端進行插入和刪除運算。這一端被稱為棧頂,相對地,把另一端稱為棧底。向一個棧插入新元素又稱作進棧、入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素;從一個棧刪除元素又稱作出棧或退棧,它是把棧頂元素刪除掉,使其相鄰的元素成為新的棧頂元素。2、常式:
#include <stdio.h>
#include <stdlib.h>
#define Max 100
typedef char T;

typedef struct MyStack
{
T aa[Max];
unsigned int p;

} stack;

/哪鬧/創建空棧
stack* createEmptyStack()
{
stack* st = (stack *)malloc(sizeof(stack));
int i=0;
for(i=0;i<Max;i++)
st->aa[i]=0;
st->p=0;
return st;
};

//棧判空
int isEmpty(const stack* st)
{
if(st->p==0) return 1;
else return 0;
};

//求棧的大小
unsigned int size(const stack* st)
{
return st->p;
};

//push操作
void push(stack* st,const T a)
{
st->p=st->p+1;
if(st->p==Max)
{
printf("棧滿\n");
st->p--;
return;
}
st->aa[st->p]=a;
};

//pop操作
T pop(stack* st)
{
if(isEmpty(st))
{
printf("棧空");
return NULL;
}
char t=st->aa[st->p];
st->p=st->p-1;
printf("隱拍%c ",t);
return t;
};

//棧銷毀
void destroy(stack* st)
{
free(st);
};

int main()
{

stack* st = createEmptyStack();
if(isEmpty(st)) printf("MyStack is empty\n");
else printf("MyStack is not empty\n");
push(st,'a');
push(st,'b');
push(st,'c'灶緩羨);
push(st,'d');
push(st,'e');
printf("%d\n",size(st));
while(!isEmpty(st)) pop(st);
destroy(st);
system("pause");
return 0;
}

⑥ 貨物出棧進棧演算法

進棧出棧滿足先進後漏森出順序,所世搜渣以進棧要先進搜悄生產日期後進,分別用兩個函數程序編寫,主程序滿足進棧出棧就可以了

⑦ 棧的進出演算法..

棧數據操作是先進後出,後進先出,但是這是說已經存儲在棧的數據,對於尚未進棧的數據流,這種說法是不正確的。拿上面的例子說,分別說明:A:1進棧,1出棧,2進棧,3進棧,3出棧,2
出棧,4進棧,4
出棧B:1進棧,2進棧,3進棧,3出棧,4進棧,4出棧,2
出棧,1
出棧D:1進棧,2進棧,2出棧,3進棧,3出棧,4進棧,4
出棧,1
出棧
C答案明顯是1,2,3,4順序進棧,出棧順序只能是4,3,2,1,圓敬1是
不能比2
先出棧,因為1,2已經在棧,而且1比2現進棧。所以,渣慶在判斷出棧順序的時候,需要考慮在進棧的如腔握過程中是否有棧元素出棧,而不能只考慮所有元素進棧後的出棧順序。

⑧ 棧的順序結構和入棧、出棧演算法

typedef struct {
SElemType *base;/*設棧頂棧底兩指針的目的是便於判斷棧是否為空*/
SElemType *top;/*棧的當前可使用的肆友型最大容量*/
int StackSize;
}SqStack;

int Push(SqStack &S,SElemType e){
if(S.top-s.base>=S.stacksize){
S.base=(ElmenType *)realloc(S.base,
(S.stacksize+STACKINCREMENT)*sizeof(ElemType));
if(!S.base)exit(OVERFLOW);
S.top=S.stacksize;
S.stacksize+=STACKINCREMENT;
}/*Push*/
*S.top++=e;
return OK;
}

int Pop(SqStack &S,SElenType &e){
if(空缺裂猜部分)return ERROR;
e=*--S.top;
return OK;
}/告春*Pop*/

⑨ 入棧出棧題目怎麼做

棧的原則是先進後出,進棧序列為el,e2,e3,e4,芹信不是說一次性進入的,而是先進了el,e2,這時候出棧的話一定出e2,e3,e4又進棧,這時候出棧順序就是e4,e3,el 了,總的出棧順序就是e2,e4,e3,渣州el 了。

棧的特點是先進後出,即:進去的早,出來的晚。

54321進棧,5在棧底,1在棧頂!

出一次棧,則棧頂的1先出來,2成為新的棧頂。

ABCD入棧,D成為新的棧頂。

全部出棧:D C B A 2 3 4 5

綜上,所有元素退棧順序為:1 D C B A 2 3 4 5

進棧(PUSH)演算法

①若TOP≥n時,則給出溢出信息,作出錯處理(進棧前首先檢查棧是否已滿,滿則溢出;不滿則作②);

②置TOP=TOP+1(棧指針加1,指向進棧地址);

③S(TOP)=X,結束(X為新進棧的元素);

退棧(POP)演算法

①若TOP≤0,則給出下溢信息,作出錯處理(退棧前先檢查是否已為空棧, 空則下溢;不空則作嫌梁輪②);

②X=S(TOP),(退棧後的元素賦給X):

③TOP=TOP-1,結束(棧指針減1,指向棧頂)。

以上內容參考:網路-棧

⑩ 棧的入棧和出棧的順序規律是什麼

入棧的順序規律是排在前面的先進,排在後面的後進。

棧中的數據只有一種方式出棧,即先進後出,所以出棧的可能數目跟入棧的可能排列數目是一致的。a的出入有2中可能,b的出入有2種可能,c的出入有2種可能,d只需要關系入,只有一種可能。所以可能的出棧方式數為2*2*2*1=8種。

入棧順序:a、b、c、d。出棧順序可以是:d、c、b、a;a、b、c、d;b、a、c、d很多,但要把棧想像成一個沒蓋子的紙箱,取出東西時只能從最上層取,放進東西也只能放在最上層,所以棧是一個「後進先出」或「先進後出」的順序存儲結構。


相關介紹:

棧又名堆棧,它是一種運算受限的線性表。限定僅在表尾進行插入和刪除操作的線性表。這一端被稱為棧頂,相對地,把另一端稱為棧底。

向一個棧插入新元素又稱作進棧、入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素;從一個棧刪除元素又稱作出棧或退棧,它是把棧頂元素刪除掉,使其相鄰的元素成為新的棧頂元素。

熱點內容
內置存儲卡可以拆嗎 發布:2025-05-18 04:16:35 瀏覽:336
編譯原理課時設置 發布:2025-05-18 04:13:28 瀏覽:378
linux中進入ip地址伺服器 發布:2025-05-18 04:11:21 瀏覽:612
java用什麼軟體寫 發布:2025-05-18 03:56:19 瀏覽:32
linux配置vim編譯c 發布:2025-05-18 03:55:07 瀏覽:107
砸百鬼腳本 發布:2025-05-18 03:53:34 瀏覽:944
安卓手機如何拍視頻和蘋果一樣 發布:2025-05-18 03:40:47 瀏覽:740
為什麼安卓手機連不上蘋果7熱點 發布:2025-05-18 03:40:13 瀏覽:803
網卡訪問 發布:2025-05-18 03:35:04 瀏覽:511
接收和發送伺服器地址 發布:2025-05-18 03:33:48 瀏覽:371