栈?可以看做一种特殊的?数组?,所以我使用第一节实现的?动态数组?来实现栈这种数据结构。当然,栈也可以通过其他方式来实现。因为该栈是通过动态数组实现的,所以称之为?数组栈?。
栈的结构如上图所示,可知栈的基本特性如下: 1.栈?有?栈顶?和?栈底?两端。 2.入栈?和?出栈?操作只能从?栈顶?进行。 3.后?入栈?的先?出栈?,即?后进先出(Last In First Out),LIFO?。
程序演示? ? 将0-9分别入栈再出栈
#include<stdio.h>
#include<stdlib.h> //快速注释多行:Ctrl +K 然后 Ctrl + C
#include<string.h>
#define Max 10
typedef int dataType; //此处必须加分号
typedef struct mystack //写一个栈不可能单独处理一种类型的数据
{ //使用 typedef 为现有类型创建别名,给变量定义一个易于记忆且意义明确的新名字
int top;
dataType *stack; // int *stack
}STACK,*LPSTACK; // LPSTACK 结构体指针
// 初始化栈
LPSTACK initstack()
{
LPSTACK mytempstack=(LPSTACK) malloc (sizeof(STACK)); //结构体指针 创建一个栈
// 数据成员初始化 分配内存
mytempstack->stack =(dataType*)malloc(sizeof(dataType)*Max);
mytempstack->top =-1; // 不能使用. 结构体变量用 . 运算符来访问结构体的成员
// 指向结构体的指针用->来访问其指向的结构体的成员
return mytempstack; //可以使用 memset()函数初始化 也可以不初始化
}
//入栈操作函数
void push(LPSTACK mytempstack ,dataType data) //入的哪一个栈 入的哪一个数据
{
if(mytempstack->top >= Max)
{
printf("栈满,无法入栈\n");
return ;//结束函数 return是使整个函数返回 当然可以用return中断程序。
}
else
{
mytempstack->stack [++mytempstack->top]=data; //stack是指针
printf("入栈数字为%d\n",data);
}
}
// 出栈操作函数
void pop(LPSTACK mytempstack)
{
if(mytempstack->top ==-1)
{
printf("栈空,无法出栈");
return ;//结束函数 return是使整个函数返回 当然可以用return中断程序。
}
else
//mytempstack->stack [--mytempstack->top]; //stack是指针
--mytempstack->top;
}
// 获取元素
dataType getTop(LPSTACK mytempstack)
{
return mytempstack->stack [mytempstack->top];
}
//判断栈是否空了
int isEmpty(LPSTACK mytempstack)
{
if(mytempstack->top ==-1)
return 1;
else
return 0;
}
int main()
{
int i=0;
LPSTACK mystack1=initstack();
/*push(mystack1,1);
push(mystack1,4);
push(mystack1,5);
push(mystack1,6);*/
for(i=0;i<10;i++)
push(mystack1,i);
while(!isEmpty(mystack1))
{
printf("从栈弹出的数据是%d\n",getTop(mystack1));
pop(mystack1);
}
system("pause");
return 0;
}
调试结果
|