『壹』 數據結構 用c語言判斷一個棧是否為空的演算法
判斷棧頂指針與棧底指針是否相等(是否指向同一個結點)。
如果相等則為空。
否則非空。
『貳』 給出棧的兩種存儲結構的形式名稱,在這兩種棧的存儲結構中如何判別棧空與棧滿
【解答】(1)順序棧 (top用來存放棧頂元素的下標)
判斷棧S空:如果S->top==-1表示棧空。
判斷棧S滿:如果S->top==Stack_Size-1表示棧滿。 (2) 鏈棧(top為棧頂指針,指向當前棧頂元素前面的頭結點) 判斷棧空:如果top->next==NULL表示棧空。
判斷棧滿:當系統沒有可用空間時,申請不到空間存放要進棧的元素,此時棧滿。
『叄』 數據結構里順序存儲和鏈式存儲判定棧空和棧滿的條件分別是什麼
順序
空 top=-1;
滿 top=maxsize-1
鏈式
空 top->next=null
動態分配空間,沒有滿
『肆』 編寫一個C源程序,其中包含順序表示的空棧的創建、判斷棧是否為空、進棧、出棧、取棧頂元素等操作。
樓主你好
以下是順序棧的操作實現(c語言代碼):
#include<stdio.h>
#include<malloc.h>
#define MAX 20
typedef struct node
{
int data[MAX];
int top;
}Stack;
void Initial_Stack(Stack * &s)//初始化棧
{
s=(Stack *)malloc(sizeof(Stack));
s->top=-1;
}
void Empty_Stack(Stack *s)//判斷棧是否為空
{
if(-1 == s->top)
printf("棧空!\n");
else
printf("棧非空!\n");
}
void Creat_Stack(Stack * &s)//創建棧
{
int i=0;
printf("Enter the data:\n");
do{
scanf("%d",s->data+i);
s->top=i;
i++;
}while(i<MAX&&getchar()!='\n');
}
void Disp_Stack(Stack * &s)//列印棧
{
int i;
for(i=s->top;i>=0;i--)
printf("%d: %d\n",s->top-i+1,s->data[i]);
}
void Push_Stack(Stack * &s,int e)//壓棧
{
if(s->top==MAX-1)
{
printf("Stack full!\n");
return;
}
s->top++;
s->data[s->top]=e;
printf("After push:\n");
Disp_Stack(s);
}
void Pop_Stack(Stack * &s)//出棧
{
if(s->top==-1)
{
printf("Stack empty!\n");
return;
}
s->top--;
printf("After pop:\n");
Disp_Stack(s);
}
int main()
{
Stack *S;
Initial_Stack(S);
Empty_Stack(S);
Creat_Stack(S);
Empty_Stack(S);
printf("Initial stack:\n");
Disp_Stack(S);
Push_Stack(S,0);
Pop_Stack(S);
return 0;
}
希望能幫助你哈
『伍』 這樣定義的棧,怎樣判斷棧空,請高手指教
你自己在出棧的函數里不是已經判斷了嘛
就是判斷top是否為NULL;(出棧函數的第二個參數沒用)
仔細看了一下程序很多細節你已經注意了,,所以可以通過top是否為NULL判斷棧是否為空!
『陸』 如何判斷數據結構中棧為空的問題
你說的這個情況應該是以數組構成順序棧的情況下的 一個數組以數組底為棧底,而棧頂時鍾標志是始終操作棧頂元素的。也就是說,你要壓棧,必須先把棧頂標志加一之後才能寫入,你要彈棧需要先讀出再把棧頂標志減一。 那麼,棧為空的時候標志肯定不能是0,因為它標志著棧頂元素是數組的第一個值,這樣代表棧里是有一個元素的。所以,top是-1的時候它才是空棧,寫入的時候要先加一,指向數組第一個空間了才能寫 這個沒有規定 但是要糾正一點,top是一個整型標志,它並不是一個數組下標,只是在這里你把它用作下標了 如果它是-1的時候用作下標肯定是不行的,但是作為一個棧,這個情況是不會出現的,因為你在彈棧之前肯定會檢測棧是否為空,你不會明明知道棧是空的還進行彈棧操作吧(如果硬是要操作當然出錯了),空棧壓棧前top會自加一的,這個時候是用作了下標,但是它不是-1了,所以,你擔心的數組下標問題不會存在 至於你說建立棧的話,你如果要想使用順序棧就要這樣做,定義棧空只能是top=-1 。或者,你會增加一個棧元素計數器??這樣太不劃算了追問: 我再問一下,請問就是怎麼規定top的位置啊?書上說的是習慣上稱指示棧頂位置的成員top為棧頂指針,這句話怎麼理解?那比如有4個元素的棧,我想刪除1位置上的,那麼棧的刪除方式是從棧頂指針處刪除,那麼我只需刪除1位置上的top對嗎?那麼這個top和棧頂指針什麼關系?怎麼定義啊?我沒看到說top就是數組下標的這個說法。。。回答: c語言應用的時候一般不是以 stack[top]的形勢 而是 stack + top的形勢 此時 stack是一個指針 ,指針與整型做加法表示的是偏移量 top的值就是偏移量咯,它代表元素位置。這就是那個理解方式 指示棧頂位置的成員top就是這里的整型變數top 棧是一個先入後出的數據結構,你想刪除位置1上的,那就不得不從4開始一個個的刪除,不能從中間刪除,這是棧的特性
『柒』 對於棧的數組實現,判斷棧是否為空的代碼是
你說的這個情況應該是以數組構成順序棧的情況下的
一個數組以數組底為棧底,而棧頂時鍾標志是始終操作棧頂元素的。也就是說,你要壓棧,必須先把棧頂標志加一之後才能寫入,你要彈棧需要先讀出再把棧頂標志減一。
那麼,棧為空的時候標志肯定不能是0,因為它標志著棧頂元素是數組的第一個值,這樣代表棧里是有一個元素的。所以,top是-1的時候它才是空棧,寫入的時候要先加一,指向數組第一個空間了才能寫
這樣一想你就應該知道為什麼top是-1時候代表棧空了
『捌』 定義棧的順序存儲結構,實現入棧操作,出棧操作,判斷棧為空的基本操作,設計演算法,
下面是一個棧的演算法
#include<stdio.h>
#include<stdlib.h>
typedefstructNode{
intiData;
structNode*pNext;
}Node;
voidpush(Node**pTop,intiData)
{
Node*pNew=(Node*)malloc(sizeof(Node));
pNew->pNext=NULL;
pNew->iData=iData;
if(NULL==(*pTop)){
(*pTop)=pNew;
}else{
pNew->pNext=(*pTop);
(*pTop)=pNew;
}
}
voidpop(Node**pTop)
{
Node*pDel=NULL;
if(NULL==(*pTop)){
printf("Empytstack! ");
}else{
printf("stackvalue:%d ",((*pTop))->iData);
pDel=(*pTop);
(*pTop)=(*pTop)->pNext;
}
}
voidprint_stack(Node*pTop)
{
Node*p=pTop;
while(p){
printf("print_stack:%d ",p->iData);
p=p->pNext;
}
}
intmain()
{
Node*pTop=NULL;
inti,ii;
for(i=1;i<10;i++)
{
push(&pTop,i);
}
print_stack(pTop);
for(ii=1;ii<10;ii++)
{
pop(&pTop);
}
return0;
}
『玖』 判定一個順序棧st(最多元素為MaxSize)為空的條件是什麼
當兩個指針相等時,棧為空!第一個指針是指向棧的首個元素,而第二個指針是指向最後一個元素的下一個位置,所以當兩個指針相等時,棧就是空的了!
『拾』 求助,入棧一定要判斷棧是否為空嗎
不一定,鏈棧在入棧前不需要判斷棧是否滿,只需要為入棧元素動態分配一個結點空間,而順序棧在入棧前必須判斷棧是否滿,