十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
您好:
网站建设哪家好,找创新互联建站!专注于网页设计、网站建设、微信开发、小程序开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了徐州免费建站欢迎大家使用!
你是在学习数据结构方面的知识吧。
首先呢,你学习栈,要了解栈的定义,明白它是怎么一回事,就是去理解他的思想。
最后才去用代码来体现出来。
栈是先进后出,其实是用代码控制的,
其实你要他先进先出也可以。
你只要明白他的原理就行。
代码,你可以理解为跟计算的一种对话的语言。
不用想的那么复杂。
就好比说话,你只要知道你要说什么就行(算法),而不用刻意明白要怎么说(语法)。
下面给我出我以前写的代码,关于栈的,顺序栈,其实还有链栈。
/* 数据结构-栈 */
/* 异常的细节处理还没弄好*/
#include iostream
#include stdlib.h
#include malloc.h
#define len_chu_shi 50 //初始空间大小
#define len_zeng_jia 10 //额外增加空间大小
#define OK 0 //正确
#define OVER -2 //
#define ERROR -1 //
using namespace std;
typedef int elem_type; //元素类型
typedef int function_type; //函数类型
typedef struct zhan
{
elem_type *top; //栈顶
elem_type *base; //栈底
int len; //当前空间大小
}zhan; //栈结构
function_type Init_zhan(zhan *exam);//初始化栈
function_type Get_top(zhan *exam,elem_type *e);//获取栈顶元素
function_type Add_top(zhan *exam,elem_type *e);//增加栈顶元素
function_type Delete_top(zhan *exam, elem_type *e);//删除栈顶元素
int main(int argc,char *argv[])
{
zhan *example = (zhan *)malloc(sizeof(zhan));
Init_zhan(example);
return OK;
}
function_type Init_zhan(zhan *exam)
{
exam-base = (elem_type *)malloc(len_chu_shi*sizeof(elem_type));
if(!exam-base) //分配失败
exit(OVER);
exam-top = exam-base;
exam-len = len_chu_shi;
return OK;
}//--end
function_type Get_top(zhan *exam,elem_type *e)
{
if(!exam-base)
exit(OVER);
*e = *(exam-top - 1); //不能用自减运算符,那样会改变栈顶指针的值
return OK;
}//--end
function_type Add_top(zhan *exam,elem_type *e)
{
if(exam-len = exam-top - exam-base) //我个人觉得,如果 已经"",就已经数据溢出了,就应该报错
exam-base = (elem_type *)realloc(exam-base,(exam-len + len_zeng_jia)*sizeof(elem_type));
if(!exam-base) //分配失败
exit(OVER);
*(exam-top++) = *e; //应该是先改变栈顶指针的内容,然后栈顶指针再自增
exam-len += len_zeng_jia;
return OK;
}//--end
function_type Delete_top(zhan *exam, elem_type *e)
{
if(!exam-base) //空栈
exit(OVER);
*e = *(--exam-top); //应该是栈顶指针先自减,然后获取栈顶指针的内容
return OK;
}//--end
#include
stdio.h
int
stack[100];
/*100个栈空间*/
int*
sp
=
stack;
/*栈指针指向栈底*/
#define
push(
i
)
{
*sp++
=
i;
}
/*push一个数*/
#define
pop()
(*--sp)
/*pop一个数并返回*/
int
main()
{
int
i;
for
(
i
=
0;
i
10;
++i
)/*push
0~9*/
push(
i
);
for
(
i
=
0;
i
10;
++i
)/*输出9~0*/
printf(
"%d
",
pop()
)
;
}
C语言函数参数入栈顺序从右到左是为了方便可变参数函数。
一、在函数调用时,函数参数的传递,在C语言中是通过栈数据结构实现的。
在调用函数时,先根据调用函数使用的参数,自右向左依次压入栈中,然后调用函数,在函数开始执行时,将参数再依次弹栈。根据栈数据结构先进后出的特点,在函数中弹栈的顺序就是从左向右的。
二、对于参数固定的函数,无论是从左向右还是从右向左,都没什么区别,最终都是所有参数全部传递。
三、对于可变参数,比如printf,会在第一个参数格式字符串中,指明后续有几个参数,各自是什么类型的。于是在函数中,参数格式字符串必须第一个弹栈,否则无法获取参数类型,也就无法获知后续参数占几个字节,导致无法正确获知参数。
四、理论上来说,如果从左向右压栈,可变参数标记格式字符串的参数放在最后,那么也是可以的。 不过最早设计C语言的人采用了这种方式,后续也就延续下来了。