写在前面———
进入到了一个新的章节了,这次学习的内容是“栈”。老规矩,先来一段定义(搬运自百度)
栈
""
栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
""
图示:
所以可以看出,栈本质上就是一个顺序表,甚至某些功能可能还没有单纯的顺序表完善。那我们在已经学习了众多功能强大的线性表之后,为什么还要倒退回去学一个不完整版的顺序表呢?它又有哪些精彩的运用呢?敬请期待下两篇博客——“栈的运用之括号匹配”,“栈的应用之简单的计算器”。这里先对栈的简单功能进行实现。
代码实现如下:(其实跟顺序表几乎一毛一样,就不细说了)
1.定义结构体(这步,应该不用细说了吧,哈哈)
typedef struct zhan{
int top;
int data[max_size];
}*zhanptr; //of typedf
2.定义显示函数
void outputzhan(zhanptr paraptr)
{
int i;
for(i=0;i<paraptr->top;i++)
{
printf("%c ",paraptr->data[i]);
}
printf("\r\n");
} //of output function
3.初始化
zhanptr initzhan()
{
zhanptr tempptr=(zhanptr)malloc(sizeof(zhan));
tempptr->top=-1;
return tempptr;
} //of init function
4.定义“压入”函数
void pushzhan(int paravalue,zhanptr paraptr)
{
if(paraptr->top >=max_size-1)
{
printf("can not do the action!\n");
}
paraptr->top++;
paraptr->data[paraptr->top]=paravalue;
} //of push fuction
5.定义“弹出”函数
char popzhan(zhanptr paraptr)
{
if(paraptr->top<0)
{
printf("can not do this action!\n");
}
paraptr->top--;
return paraptr->data[paraptr->top+1];
} //of pop fucton
6.测试函数
void pushPopTest() {
printf("---- pushPopTest begins. ----\r\n");
// Initialize.
zhanptr tempStack = initzhan();
printf("After initialization, the stack is: ");
outputzhan(tempStack);
// Pop.
char ch;
for ( ch = 'a'; ch < 'm'; ch ++) {
printf("Pushing %c.\r\n", ch);
pushzhan(ch,tempStack);
outputzhan(tempStack);
}//Of for i
// Pop.
int i;
for ( i = 0; i < 3; i ++) {
ch = popzhan(tempStack);
printf("Pop %c.\r\n", ch);
outputzhan(tempStack);
}//Of for i
printf("---- pushPopTest ends. ----\r\n");
}
7.完整版伪代码
(不含main函数)
#include<stdio.h>
#include<malloc.h>
#define max_size 10
typedef struct zhan{
int top;
int data[max_size];
}*zhanptr; //of typedf
void outputzhan(zhanptr paraptr)
{
int i;
for(i=0;i<paraptr->top;i++)
{
printf("%c ",paraptr->data[i]);
}
printf("\r\n");
} //of output function
zhanptr initzhan()
{
zhanptr tempptr=(zhanptr)malloc(sizeof(zhan));
tempptr->top=-1;
return tempptr;
} //of init function
void pushzhan(int paravalue,zhanptr paraptr)
{
if(paraptr->top >=max_size-1)
{
printf("can not do the action!\n");
}
paraptr->top++;
paraptr->data[paraptr->top]=paravalue;
} //of push fuction
char popzhan(zhanptr paraptr)
{
if(paraptr->top<0)
{
printf("can not do this action!\n");
}
paraptr->top--;
return paraptr->data[paraptr->top+1];
} //of pop fucton
void pushPopTest() {
printf("---- pushPopTest begins. ----\r\n");
// Initialize.
zhanptr tempStack = initzhan();
printf("After initialization, the stack is: ");
outputzhan(tempStack);
// Pop.
char ch;
for ( ch = 'a'; ch < 'm'; ch ++) {
printf("Pushing %c.\r\n", ch);
pushzhan(ch,tempStack);
outputzhan(tempStack);
}//Of for i
// Pop.
int i;
for ( i = 0; i < 3; i ++) {
ch = popzhan(tempStack);
printf("Pop %c.\r\n", ch);
outputzhan(tempStack);
}//Of for i
printf("---- pushPopTest ends. ----\r\n");
}
一些感悟:
单看这一章,是万万不可能体会到栈的强大功能的,甚至还会让人疑惑,为什么要倒退回去,学一个比较“落后”的东西。然而,当运用好它了过后,将体会到栈的引入对我们有多么大的帮助!