10分钟写代码,1小时改代码,微笑.jpg,改代码语法错误编译器就能找出来,逻辑错误就mmp了,涉及到系统堆栈就更痛苦了。然而最扎心的时,改了一个早上调了一个早上,结果标点符号没改一个就运行成功了,我的编译器这是存心和我作对呢吧!电脑还十分配合的动不动就来个没有相应。配置低的电脑加win7真让我心力交瘁。吐槽完了,要干正事了,选择了就要坚持啊!
- 栈的介绍
栈是一种运算受限的线性结构,只能在表尾进行操作,这特殊的一端呢我们称之为栈顶top,表头称作栈底base。
考试的时候呢,会涉及到1、进出栈的顺序;2、栈的容量;3、栈中元素的指针。网上很多例题,这里不再赘述了,直接上代码吧。原本很简单的结构却折腾了我一早上。
1、头文件以及宏定义等
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
typedef int SElemType;
#define STACK_INIT_SIZE 20//存储空间初始分配量
#define STACKINCREMENT 10//存储空间初始分配量
2、顺序栈的定义
//顺序栈的定义
typedef struct {
SElemType *base;//栈底指针
SElemType *top;//栈顶指针
int stacksize;//当前可使用最大容量
}SqStack;
3、栈的初始化
//初始化栈
SqStack Initstack(SqStack &S){
if(!(S.base =(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType))))exit(-1);
S.top =S.base ;
S.stacksize =STACK_INIT_SIZE;
return S;
}
4、进栈(说明一下:当栈非空时,栈顶指针时指向栈顶元素的上一个位置的)
//插入一个元素
SqStack Push(SqStack &S,SElemType e){
if(S.top -S.base >=S.stacksize ){//栈满扩容
S.base =(SElemType*)realloc(S.base ,(S.stacksize +STACKINCREMENT)*sizeof(SElemType));
if(!S.base ) exit(-1);
S.top =S.base +S.stacksize ;
S.stacksize +=STACKINCREMENT;
}
*S.top=e;//先插入后移指针
S.top ++;
return S;
}
5、退栈
//退栈
int Pop(SqStack&S){
if(S.base ==S.top )return -1;
printf("%d\t",*--S.top );
return 0;
}
6、主函数
int _tmain(int argc, _TCHAR* argv[])
{
int arr[6],i;
SqStack S;
S=Initstack(S);
for(i=0;i<10;i++){
arr[i]=rand()%10+15;//自动生成15-25的随机正整数,不包括25
printf("%d\t",arr[i]);
}
for(i=0;i<10;i++)
Push(S,arr[i]);
while(S.top){
Pop(S);
}
system("pause");
return 0;
}
这里直接用的系统生成的随机数,懒得输入了。要从事程序员这个行业,调试比写代码重要多了,新入门的小伙伴们,一定不要嫌调试太麻烦,改代码虽然很花费时间,但是学到的东西却是职业生涯中终生受用的。