当前位置:首页 » 编程软件 » 进栈编程

进栈编程

发布时间: 2024-03-01 09:57:59

㈠ 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
}

㈡ 编程实现链栈的入栈和出栈操作。 在线等着你哦!

#include<stdio.h>
#include<stdlib.h>
typedefstructSnode
{
intdata;/*数据域*/
structSnode*next;/*指针域*/
}SNODE,*LinkStack;/*其中SNODE为链栈中的结点类型名,LinkStack为指向结点的指针类型名*/
//////////////////
LinkStackPush(LinkStacktop,inte)
/*将数据元素e压入到链栈top中,使其成为新的栈项元素*/
{
LinkStackp;
p=(LinkStack)malloc(sizeof(SNODE));/*生成一个新的结点*/
if(!p)/*如果分配空间失败,则函数返回"OVERFLOW"*/
printf("StackisOverflow ");
p->data=e;/*新结点的数据域赋值*/
p->next=top;/*修改链使新结点插入到链表的头部,并成为新的栈顶元素*/
top=p;
returntop;
}
/////////////
LinkStackPop(LinkStacktop,int*e)
/*将链栈top中的栈顶元素从栈中删除,并用e返回其值*/
{
LinkStackq;
if(!top)/*如果栈空,则函数返回ERROR*/
printf("StackisERROR ");
*e=top->data;/*将被删的栈顶元素的值保存在e中*/
q=top;/*用q记下待删的栈顶元素*/
top=q->next;
/*修改链使待删结点从链中"卸下",此时被删结点的后继成为新的栈顶元素结点*/
free(q);/*释放被删结点的存储空间*/
returntop;
}
/////////
LinkStackStack_display(LinkStacktop)
{
inte;
while(top)
{
e=top->data;
printf("%4d",e);
top=top->next;
}
returntop;
}
/////////////////////
voidmain()
{
LinkStacktop=0;
inti=0,n,e;
printf("pleaseinputthelength:");/*输入几个数*/
scanf("%d",&n);
printf("pleaseinputtheValue: ");/*输入*/
while(i<n)
{
scanf("%d",&e);
top=Push(top,e);
i++;
}
printf("thestackis: ");
Stack_display(top);
printf("pleaseinputtheinsertnode:");
scanf("%d",&e);
top=Push(top,e);
printf("thestackafterpushis: ");
Stack_display(top);
top=Pop(top,&e);
printf("thepopvalueis:%d ",e);
printf("thestackafterpopis: ");
Stack_display(top);
}

调好了麻烦采纳一下

㈢ 数据结构 用C语言编程实现进栈出栈

希望如下对你有用:
/*栈的基本操作*/
#
define
stacksize
100
/*定义栈的最大存储空间*/
#
define
LEN
sizeof(struct
stack)
static
size=0;
struct
stack
{
int
data;
int
*top[stacksize];
};
struct
stack
*sqstack;
struct
stack
*s;
static
e;
int
push()
/*将元素压入栈*/
{
if
(size<=stacksize)
*
sqstack->top[size++]=e;
else
printf
("
the
stack
is
full:");
}
int
pop(struct
stack
*sqstack,int
location)
/*元素出栈*/
{
e=*(sqstack->top[location]);
return
(e);
}
main()
{
int
n,i,t,x=0;
int
element;
printf
(
"\n
create
the
stack
first
:");
scanf
("%d
",&n);
for
(i=1;i<=n;i++)
{
scanf
("%d",&e);
push
(e);
}
s=sqstack;
t=size;
printf
("\n
after
pushed
,
the
sqstack
is
:");
while
(t>=0)
{
*s->top[t]=*sqstack->top[t];
t--;
}
t=size;
while
(t!=0)
{
t--;
e=pop(s,t);
printf
("
%d->",e);
}
printf
("\n
which
element
you
want
to
pop
:");
scanf
("%d",&element);
while
(size!=0)
{
e=pop(sqstack,size--);
if
(element==e)
{
printf
("\n
%d
is
poped",element);
x=1;
}
}
if(x==0)
printf
("\n
%d
is
not
found
in
the
sqstack.\n",element);
}


㈣ C语言编程实现顺序栈的初始化,入栈,出栈,取栈顶元素,显示操作

#define STACKSIZE 100
int mstack[STACKSIZE],top,bottom;
void mInitStack() { top=bottom=0; }
void mPush(int x) { if ( top-bottom<=STACKSIZE ) { mstack[top]=x; top++; } }
int mPop() { int r=0; if ( top>bottom ) { r=mstack[top]; top--; } return r; }
void mShowStack() { int i; printf("["); for ( i=bottom;i<top;i++ ) printf("%d ",mstack[i]); printf("] "); }
void main()
{
int i,n,x,loop=1,s;
char buffer[80];
mInitStack();
scanf("%d",&n); for ( i=0;i<n;i++ ) { scanf("%d",&x); mPush(x); }
mShowStack();
while ( loop )
{ buffer[1]=0; gets(buffer); s=1;
switch ( buffer[1] )
{ case 'O':
case 'o': x=mPop(); break;
case 'U':
case 'u': x=atoi(buffer+5); mPush(x); break;
case 'n':
case 'N': loop=0; break;
default: s=0; break;
}
mShowStack();
}
mShowStack();

}

热点内容
sql2008数据同步 发布:2024-11-16 02:33:46 浏览:927
sql2008sa密码 发布:2024-11-16 02:33:45 浏览:198
pr清缓存 发布:2024-11-16 02:31:28 浏览:656
ae86赛车编译环境 发布:2024-11-16 02:30:53 浏览:179
反编译游戏程序 发布:2024-11-16 02:21:56 浏览:453
androidapp调用app 发布:2024-11-16 02:20:15 浏览:668
超市管理系统sql 发布:2024-11-16 02:15:24 浏览:732
iphone百度云上传 发布:2024-11-16 01:59:04 浏览:419
公共场合ftp 发布:2024-11-16 01:28:20 浏览:227
福特悠享版有哪些配置 发布:2024-11-16 01:22:06 浏览:594