当前位置:首页 » 编程语言 » c语言判断栈费空
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言判断栈费空

发布时间: 2023-01-05 02:26:22

⑴ 数据结构(c语言)两个栈共存储在一个长度为n的一维数组中……

想法是stack1,stack2的base分别在数组的两端。
stack1每次push的时候top + 1,stack2每次push时top-1,
初始时top1=base1,top2=base2,判断是否用空余空间可以用stack1.top > stack2.top
pop操作相反,判断栈空可以用stack.base == stack.top

⑵ c语言数据结构高手请进,关于顺序栈的基本操作问题。

1. 想通过调用函数改变某个变量的值,必须传递这个变量的地址。也就是在InitStack中申请的内存并没有赋给Main中的s变量,会导致后面的访问出错。改为引用就可以了:
void InitStack(SqStack* &s)//初始化栈
{
s=(SqStack *)malloc(sizeof(SqStack));
s->top=-1;
}

2.在"Pop(s,e);", 这个e并没有内存,导致"*e=s->data[s->top];"出错。
需要给它申请内存:
ElemType *e = (ElemType*)malloc(sizeof(ElemType));
最后"free(e);"一下。

⑶ C语言的相关问题

呵呵,初看这些题,我想楼主应该会觉得很简单吧,其实不然,这些题目看上去简单,
实际上稍微有点不严谨就会算错,下面我说下我的答案与分析过程
首先有几个基本概念楼主要知道:
【一、以上都是逻辑表达式,得出的结果要么是0,要么是1.
二、在逻辑表达式中计算的时候,非零的数值被认为是真,为零则是假,输出的时候,如果是假则输出0,真则输出1。
三、“&&”的优先级高于“||”,也就是说如果在一句话里面即出现了“&&”又出现了“||”,那么则先执行“&&”,再执行“||”】
1、0【因为b不等以c所以右端为0由于是“&&”连接所以
整句为0】
2、1【因为左端a不等于0即为真,而又是用“||”连接,所以表达式结果直接为0】
3、1【最优端为1,又是用“||”连接所以表达式为1】
4、0【最右端为0所以,又是用“&&”连接,所以为0】
5、1【“&&”的两端计算结果都不为0,所以表达式为1】
PS:【实际上如果出现a||(表达式)的情况的时候,计算机首先检测“||”两端有不有直接是非零的,如果此时a是非零的话,例如(1||(表达式))计算机是不会计算右边的表达式的,因为无论右边表达式的值是0还是1,结果都是1.只有当a=0的时候,才会计算。同理如果是a&&(表达式)的时候,如果a是0,则不计算右边的表达式】
第二题,1、楼主抄写时可能出错了,建议仔细检查下。
2、楼主掉了x的值,建议仔细检查下。
(PS:我想楼主写的第3题应该是第二题的参数值吧,可惜掉了x的值)

⑷ C语言帮忙看看

#include<stdio.h>
#include<stdlib.h>
#defineN10//栈的大小
typedefvoid*ELEMENT
//由于不懂你为啥在整型栈里要放入其它类型的数据,所以只能用void指针替换了
structStack
{
int*List;
intcurNumber;
};
voidiniStack(structStack*a)
{
a->curNumber=-1;
a->List=(int*)malloc(N*sizeof(int));
}
voidclearStack(structStack*a)
{
if(a->List!=null)
free(a->List);
}
voidpush(structStack*a,Elementobj)
{
if(a->curNumber<N-1)
{
a->curNumber++;
*((a->List)+a->curNumber)=*((int*)obj);
}
else
{
N=N*2;
int*tmp=(int*)malloc(N*sizeof(int));
for(inti=0;i<=a->curNumber;i++)
*(tmp+i)=*((a->List)+i);
free(a->List);
List=tmp;
a->curNumber++;
*((a->List)+a->curNumber)=*((int*)obj);
}
}
voidpop(structStack*a);
{
if(a->curNumber>-1)
a->curNumber--;
}
ELEMENTget_top(structStack*a)
{
returna->List+a->curNumber;
}
intis_empty(structStack*a)
{
if(a->curNumber>-1)return1;
elsereturn0;
}
voiddisplay(structStack*a)
{
if(a->curNumber>-1)
for(inti=curNumber;i>=0;i--)
printf("%d",*(a->List+a->curNumber));
}
intmain()
{
structStack*a;
iniStack(a);
for(inti=1;i<=4;i++)
push(a,&i);
display(a);
clearStack(a);
return0;
}

⑸ c语言栈的试题

直接拷贝上来的内容,看不出填空的下划线在哪里,所以只好自己猜一下了!

下面程序经过了修改,增加了输出辅助理解,1/2/3/4/5是猜测的填空处,同学请自己对照一下吧!

#include <stdio.h>

#include<stdlib.h>

#define M 100


typedef struct //定义栈 后进先出;

{

char data[M];

int top;

}zhan;


void cshz(zhan *s) //初始化栈

{

s->top=-1; // s.top=-1

memset(s->data, 0, sizeof(s->data));

}


int pdzk(zhan *s) //判断栈是否为空

{

// 5?

if( s->top <= -1 ) // if( s.pdzk==-1 ) // 5?

{

return 0;

}

else

{

return 1;

}

}


void ruzhan(zhan *s,char x) //入栈

{

if(s->top >= M) // if(s->top==m)

{

printf("栈满 ");

}

else

{

// 4;

s->data[s->top] = x;

s->top += 1;

printf("入栈:%c ", x);

}

}


char chuzhan(zhan *s) //出栈

{

char y;

if(s->top <= -1) // if(s->top==0)

{

printf("栈空 ");

return '0';

}

else

{

s->top -= 1;

y = s->data[s->top]; // 5;

printf("出栈:%c ", y);

return y;

}

}


typedef struct { //定义队列 先进先出;

char data[M]; // char data[m];

int front; // 头,进;

int rear; // 尾,出;

}i;


void cshdl(i *q) //初始化队列

{

// 3;

q->front = 0;

q->rear = 0;

memset(q->data, 0, sizeof(q->data));

}


void rui(i *q,char e) //入队

{

if((q->rear+1)%M==q->front)

{

printf("队列为空 ");

}

else

{

q->data[q->rear]=e;

q->rear=(q->rear+1);

printf("入队:%c ", e);

}

}


char chui(i *q) //出队

{

char f;

if( (q->rear+1)%M==q->front ) // 2;

{

printf("队列为空 ");

return 0;

}

else

{

f=q->data[q->front];

q->front=(q->front+1);

printf("出队:%c ", f);

return f;

}

}


int main()

{

char c;

int y=0;

zhan *s=(zhan *)malloc(sizeof(zhan));

i *q=(i *)malloc(sizeof(i));

cshz(s); //初始化栈

cshdl(q); //初始化队列

printf("输入一个字符串: ");

while( (c = getchar()) != ' ' ) // 1;

{

ruzhan(s,c);

rui(q,c);

}

while(pdzk(s)) //判断栈是否为空

{

if(chuzhan(s)==chui(q))

{

y=1;

}

else

{

y=0;

break;

}

}

if(y==1)

printf("此字符串为回文 ");

else

printf("此字符串不是回文 ");

printf("栈: %s top:%d ", s->data, s->top);

printf("队: %s f:%d r:%d ", q->data, q->front, q->rear);

free(s);

free(q);

return 0;

}

⑹ 编写一个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;
}

希望能帮助你哈

⑺ C语言!!!栈

#defineSTACK_SIZE100//定义栈容量为100
intcontents[STACK_SIZE];//定义数组contents用作栈
inttop=0;//定义并初始化栈顶指针为0

//函数作用:清空栈
voidmake_empty(void)
{
top=0;//直接将栈顶指针置0
}

//函数作用:判断栈是否为空
boolis_empty(void)
{
returntop==0;//返回top是否等于0
}

//函数作用:判断栈是否已满
boolis_full(void)
{
returntop==STACK_SIZE;//返回top是否等于STACK_SIZE
}

//函数作用:向栈中压入一个元素i
voidpush(inti)
{
if(is_full())//如果栈已满
stack_overflow();//执行栈上溢操作
else//否则可以入栈
contents[top++]=i;//向栈中压入i,然后将栈顶指针+1
}

//函数作用:弹出栈顶元素并返回
intpop(void)
{
if(is_empty())//如果栈为空
stack_underflow();//执行栈下溢操作
else//否则可以出栈
returncontents[--top];//返回栈顶元素,然后将栈顶指针-1
}

⑻ 初学小白问一下C语言栈代码的知识(绝对不耻下问)

这是简单的手工栈,功能简单,STL基本都能实现。具体哪一步请指出

⑼ C语言怎样选择出指定地址的内存并且判断是否为空。求代码。。。

“空”至少有两种理解:内容为0和数据无效。不知说的是哪一种,若是前者,可如下写代码——
//#include "stdafx.h"//vc++6.0加上这一行.
#include "stdio.h"
#include "time.h"//
#include "stdlib.h"
void main(void){
int n,i,*pp[4];
srand((unsigned)time(NULL));
for(i=0;i<4;i++){
pp[i]=&n+rand()%330;
if(*pp[i]) printf("Unit 0x%X is not empty!\n",pp[i]);
else printf("Unit 0x%X is empty!\n",pp[i]);
}
}
严格说来这代码的产生的地址并不是随机的,是控制在可以访问的范围内的。因为不控制的话,随机产生的地址落在不可访问区就会出错而终止执行。

⑽ 如何判断数据结构中栈为空的问题

你说的这个情况应该是以数组构成顺序栈的情况下的 一个数组以数组底为栈底,而栈顶时钟标志是始终操作栈顶元素的。也就是说,你要压栈,必须先把栈顶标志加一之后才能写入,你要弹栈需要先读出再把栈顶标志减一。 那么,栈为空的时候标志肯定不能是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开始一个个的删除,不能从中间删除,这是栈的特性