当前位置:首页 » 编程语言 » c语言栈的进

c语言栈的进

发布时间: 2022-09-24 14:15:26

1. c语言数据结构实现链栈的入栈、出栈、删除与插入

1、栈(stack)又名堆栈,它是一种运算受限的线性表。
其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

2、例程:

#include<stdio.h>
#include<stdlib.h>
#defineMax100
typedefcharT;


typedefstructMyStack
{
Taa[Max];
unsignedintp;

}stack;

//创建空栈
stack*createEmptyStack()
{
stack*st=(stack*)malloc(sizeof(stack));
inti=0;
for(i=0;i<Max;i++)
st->aa[i]=0;
st->p=0;
returnst;
};

//栈判空
intisEmpty(conststack*st)
{
if(st->p==0)return1;
elsereturn0;
};

//求栈的大小
unsignedintsize(conststack*st)
{
returnst->p;
};

//push操作
voidpush(stack*st,constTa)
{
st->p=st->p+1;
if(st->p==Max)
{
printf("栈满 ");
st->p--;
return;
}
st->aa[st->p]=a;
};

//pop操作
Tpop(stack*st)
{
if(isEmpty(st))
{
printf("栈空");
returnNULL;
}
chart=st->aa[st->p];
st->p=st->p-1;
printf("%c",t);
returnt;
};

//栈销毁
voiddestroy(stack*st)
{
free(st);
};

intmain()
{


stack*st=createEmptyStack();
if(isEmpty(st))printf("MyStackisempty ");
elseprintf("MyStackisnotempty ");
push(st,'a');
push(st,'b');
push(st,'c');
push(st,'d');
push(st,'e');
printf("%d ",size(st));
while(!isEmpty(st))pop(st);
destroy(st);
system("pause");
return0;
}

2. c语言 用数组实现栈的进出

#include <stdio.h>
#include<string.h>
void main()
{
char behavior[10];
int stack[100];
int i,n,cnt;
scanf("%d",&n);
for(i=n-1;i>=0;i--)
{
scanf("%d",&stack[i]);
}
scanf("%d",&cnt);
while(cnt--)
{
memset(behavior,0,5);
scanf("%s",behavior);
if(!strcmp(behavior,"PUSH"))
{
for(i=n++;i>0;i--)
{
stack[i]=stack[i-1];
}
scanf("%d",&stack[0]);
continue;
}
if(!strcmp(behavior,"POP"))
{
for(i=0;i<n;i++)
{
stack[i]=stack[i+1];
}
n--;
}
}
for(i=n-1;i>=0;i--)
{
printf("%d ",stack[i]);
}
printf("\n");
}
程序输入的时候没有提示(可以加),不知道你习不习惯。

3. C语言 入栈顺序为什么函数入栈顺序从右往左

C语言函数参数入栈顺序从右到左是为了方便可变参数函数。
一、在函数调用时,函数参数的传递,在C语言中是通过栈数据结构实现的。
在调用函数时,先根据调用函数使用的参数,自右向左依次压入栈中,然后调用函数,在函数开始执行时,将参数再依次弹栈。根据栈数据结构先进后出的特点,在函数中弹栈的顺序就是从左向右的。
二、对于参数固定的函数,无论是从左向右还是从右向左,都没什么区别,最终都是所有参数全部传递。
三、对于可变参数,比如printf,会在第一个参数格式字符串中,指明后续有几个参数,各自是什么类型的。于是在函数中,参数格式字符串必须第一个弹栈,否则无法获取参数类型,也就无法获知后续参数占几个字节,导致无法正确获知参数。
四、理论上来说,如果从左向右压栈,可变参数标记格式字符串的参数放在最后,那么也是可以的。 不过最早设计C语言的人采用了这种方式,后续也就延续下来了。

4. 关于进栈出栈的C语言

双击每一条错误提示,就会指示是哪一行出错,或者是其上一行的末尾有错误。因为运行环境不同所以没办法告诉你错在哪

5. C语言 进栈和出栈:

闲得没事干,跟你详细讲讲吧。
首先要弄明白一点,栈的结构是“先进后出“的,就像你堆积木一样,第一根放在最底层的地面上,然后一根一根往上堆。前一个放上去的总是被后一个放上去的压在底下。那我当我再想里面放一根的时候,总不能放中间或者放底下吧(除非你很无聊 很寂寞 闲的蛋疼了 先一根根把堆在上面的全部拿出来 然后把要放进去的那根放上去 最后又把刚才搬下来的有重新搬上去......此处省去几万字)所以要往上面加东西的时候,就得放在最上面。
以上就是进栈的原理,怎么出栈呢,很简单,直接从”积木"的最顶端取下来就行了。
ok,以上比喻完了,希望你能看得明白。接下来讲程序不说积木了:),由上面的分析 我们可以知道一个道理,对于栈的操作,栈顶的元素很重要(也就是积木最上面的那根)。为什么呢。无论是出栈还是进栈,都跟那哥们有直接的联系。你想啊,如果要是有元素要进栈的话,那么它就不能当“老顶”了,那老顶之位就要交给压在它上头那位了;如果出栈呢,它也不能当老顶了,老顶之位就要交到原来压在它底下的那个。
ok,所以一般的栈都将栈顶的那个元素所在的位置(内存地址--数组类型的,或者指针---节点类型的)视为栈的栈顶~!通过它来对栈进出进行操作。
一般来说(或者在我出生以来看到过的)栈有两种内存结构(注意是是内存结构,有的书说是存储结构,都一样一样滴),一种是连续的,一种是不连续的,连续的基本上就是数组了,不连续的基本上就是链表类型的啦。你上面的程序就是链表类型的,每个节点都有个指针指向它“底下”的节点(我觉得“底下”比下一个更容易理解)。通过这种你链我 我链它的方式,把一组数据连在一起。
进栈:
int Push(STACK *S,int e)//进栈
{
SNode *p; //step1:这个编程习惯不好,没定义一个指针就应该把它指向NULL
p=(SNode *)malloc(sizeof(SNode)); //step2:为你的节点分配内存
if(!p)
return ERROR;
p->data=e; //step3:当然了,你那个传进来的e是相当于temp,用来传值的,ok,那就把它的 数据给p咯,p实际指向的是一块内存块,用来装节点的
p->next=S->top; //step4:回到上面积木问题,进栈的时候,原来的老顶要给新来的让位,但是如果这时候的top节点直接赋给新来的元素的话,那么那个原来的老顶是不是从此以后都找不到它了?所以,先把新来的元素的next指针指向当前的老顶,这样的话,以后通过next指针就可以找到它了。
S->top=p; //当然,都已经处理好以前老顶的身后事了(就是以后可以通过p的next指针找到它了)那么“让位”就可以进行了,这时,p便戴上了 老顶 之帽了
S->length++; //既然人数都增加了,那就到公安局登记入户口吧
return OK; //一切over,现在这个栈stack的栈顶位置就是你刚才新加进来的p了,通过stock.top指针就可以访问到栈顶,然后出栈也是同理的,ok,all over
}

6. c语言的简单的进栈出栈

就用这堆函数就可以了,不懂再追问
#include
<string.h>
#define
MaxSize
100
int
mystack[MaxSize];/*
第0个单元保存现在的长度
*/
/*
初始化函数
*/
void
init_stack(int*
stack){
memset(stack,0,sizeof(stack));
}
/*
入栈函数
*/
void
push_back(int*
stack,int&
num){
if(stack[0]<MaxSize-1){
++stack[0];
stack[
stack[0]
]
=
num;
}
else{
printf("ERORR!\n");
}
}
/*
返回栈空间
*/
int
size(int*
stack){
return
stack[0];
}
/*
返回栈顶函数
*/
int
top(int*
stack){
if(stack[0]>0){
return
stack[
stack[0]
];
}
else{
printf("ERORR!\n");
return
-1;
}
}
/*
出栈函数
*/
void
pop(int*
stack){
if(stack[0]>0){
--stack[0];
}
else{
printf("ERORR!\n");
}
}

7. c语言进栈agcdegg怎么弄

摘要 我们先是写上这样的一个函数,传递过来一张栈表和一个数据类型变量。

8. 用C语言编写函数实现顺序栈的进栈、退栈、取栈顶的算法

#include<stdio.h>
#define stacksize 100 //假定预分配的栈空间最多为100 个元素
typedef char elementtype; //假定栈元素的数据类型为字符 ,在此处可以自行设置
typedef struct
{
elementtype data[stacksize];
int top;
}seqstack;
// 置空栈
void initstack(seqstack *s)
{
s->top=-1;
//解释一下,s->top 指向的是当前栈顶元素的位置
//当要向栈中添加一个新元素时,要先将s->top增加1,
//此时s->top 指向的就是新元素要添加的位置了。
//所以当栈为空时,填加第一元素时,top加1 后
//s->top的值就变为0,也就是第一个元素的位置了。
}
//判栈空
int stackempty(seqstack *s)
{
if(s->top==-1)
return 1; //若相等就返回1,否则为0
else return 0;
}
//入栈
void push(seqstack *s,elementtype x)
{
if(s->top==stacksize -1 ) //进栈前判断栈是否已经满了
printf(" stack overflow\n");
else
{
s->top= s->top + 1;
s->data[s->top]=x;
}
}
//出栈
elementtype pop(seqstack *s)
{
if(stackempty(s)) //出栈前先判断当前栈中是否有内容
printf("stack is empty\n");
else
{
return s->data[s->top--]; //出栈后s->top的值会自减1
}
}
//取栈顶元素(只是想知道栈顶的值,并没有出栈)
elementtype gettop(seqstack *s)
{
if(stackempty(s))
{
printf("stack already empty.\n");
}
else return s->data[s->top];
}
int main()
{
elementtype x;
seqstack *s; //定义一个栈,用指针的方式定义的
initstack(s); //想初始化定义好的栈
//当栈为空时调用出栈操作
pop(s);

//向栈中添加一个元素a
push(s,'a');

//观察此时的栈顶元素
x=gettop(s);
printf("%c\n",x);

//再添加一个元素b
push(s,'b');

//观察此时的栈顶元素
x=gettop(s);
printf("%c\n",x);

//弹出栈顶的元素
x=pop(s);
printf("%c\n",x);

//观察弹出后栈顶元素的变化情况
x=gettop(s);
printf("%c\n",x);
return 0;
}

9. c语言入栈的简单问题,多谢指点

#include
<stdio.h>
#include
<malloc.h>
#include
<stdlib.h>
#define
STACK_INIT_SIZE
1000
#define
STACKINCREMENT
10
typedef
struct
SqStack{
int
*base;
int
*top;
int
stacksize;
}SqStack;
SqStack
InitStack(SqStack
S){
S.base
=
(int
*)malloc(STACK_INIT_SIZE
*
sizeof(int));
S.top
=
S.base;
S.stacksize
=
STACK_INIT_SIZE;
return
S;
}
//InitStack
SqStack
Push(SqStack
S,int
e){
//插入元素e,为新的栈顶元素
if(S.top
-
S.base
>=
S.stacksize){//栈满,追加存储空间
S.base
=
(int
*)realloc
(S.base,(S.stacksize
+
STACKINCREMENT)*sizeof(int));
S.top
=
S.base
+
S.stacksize;
S.stacksize
+=STACKINCREMENT;
}
*S.top=
e;
S.top++;
return
S;
}
int
GetTop(SqStack
S){
//若栈不为空,则用e返回栈顶元素,并返回1,否则返回0
//if(S.top
==
S.base)
return
0;
int
*e;
e
=
(S.top-1);
return
*e;
}
void
printfootmark(SqStack
S){
int
tempselm;
//tempselm=GetTop(S);
for(;S.top!=S.base;){
tempselm=GetTop(S);
printf("%d
",tempselm);
S.top--;
}
printf("\n");
}
void
main(){
int
m;
SqStack
S;
S
=
InitStack(S);
S
=
Push(S,1);
S
=
Push(S,2);
S
=
Push(S,3);
printfootmark(S);
}

改成我这个代码就可以了,问题出现在你在打印输出的时候,对tempselm的赋值应该是在循环里面。不然肯定只有一个值了,接下来的打印就是对这个值输出。

热点内容
安卓服务器如何搭建服务器 发布:2024-05-08 17:33:27 浏览:537
什么安卓手机玩韩信好2021 发布:2024-05-08 17:29:01 浏览:31
信用卡登陆密码忘了怎么办啊 发布:2024-05-08 17:01:06 浏览:219
java设置图片 发布:2024-05-08 17:00:59 浏览:88
c语言空格删除 发布:2024-05-08 17:00:22 浏览:572
qt源代码编译 发布:2024-05-08 16:55:58 浏览:252
ubunto编译命令 发布:2024-05-08 16:55:01 浏览:57
为什么说人是被编译出来的程序 发布:2024-05-08 16:54:28 浏览:133
编译java底层框架 发布:2024-05-08 16:39:58 浏览:113
安卓手机怎么存图 发布:2024-05-08 16:22:09 浏览:423