‘壹’ 数据结构 用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)为空的条件是什么
当两个指针相等时,栈为空!第一个指针是指向栈的首个元素,而第二个指针是指向最后一个元素的下一个位置,所以当两个指针相等时,栈就是空的了!
‘拾’ 求助,入栈一定要判断栈是否为空吗
不一定,链栈在入栈前不需要判断栈是否满,只需要为入栈元素动态分配一个结点空间,而顺序栈在入栈前必须判断栈是否满,