出棧的演算法
① 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很多,但要把棧想像成一個沒蓋子的紙箱,取出東西時只能從最上層取,放進東西也只能放在最上層,所以棧是一個「後進先出」或「先進後出」的順序存儲結構。
相關介紹:
棧又名堆棧,它是一種運算受限的線性表。限定僅在表尾進行插入和刪除操作的線性表。這一端被稱為棧頂,相對地,把另一端稱為棧底。
向一個棧插入新元素又稱作進棧、入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素;從一個棧刪除元素又稱作出棧或退棧,它是把棧頂元素刪除掉,使其相鄰的元素成為新的棧頂元素。