//栈是一种后进先出(FILO,first-in-last-out)的线性存储结构
//只能从一端对栈进行操作,这一端叫做栈顶(top)
//栈具有的操作:
//初始化栈
//判断是否为空
//判断是否为满
//入栈
//出栈
//读取栈顶元素
//获取栈中元素个数(栈的大小)
//对栈进行遍历
//清空一个栈
//这里先用顺序存储实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 3
typedef struct Student{
char name[10];
int age;
}Stu;
typedef struct Stu_Stack{
Stu data[MAXSIZE];
int top;
}stuStack;
//初始化一个空栈
void initStack(stuStack *stack)
{
stack->top = -1;
}
//判断栈是否为空
bool isEmpty(stuStack *stack)
{
return stack->top == -1;
}
//判断栈是否为满
bool isFull(stuStack *stack)
{
return stack->top == MAXSIZE - 1;
}
//入栈
bool pushStack(stuStack *stack, Stu *s)
{
//若栈满,则入栈失败
if(isFull(stack))
{
return false;
}
//拷贝入栈元素的值到栈内,并使栈顶位置加1
memcpy(&(stack->data[++stack->top]), s, sizeof(Stu));
return true;
}
//出栈(仅仅是将栈顶位置减1,栈顶元素并未真正移除)
bool popStack(stuStack *stack)
{
//若为空栈,则出栈失败
if(isEmpty(stack))
{
return false;
}
stack->top--;
return true;
}
//取栈顶元素(返回指针类型)
Stu * getTop(stuStack *stack)
{
if(isEmpty(stack))
{
return NULL;
}
return &stack->data[stack->top];
}
//获取栈的实际大小(栈中元素的个数)
int stackSize(stuStack *stack)
{
return stack->top+1;
}
//对栈进行遍历
void visitStack(stuStack *stack)
{
if(isEmpty(stack))
{
printf("the stack is empty!\n");
return;
}
int i;
for(i = stack->top ; i >=0 ; i--)
{
printf("%s\t%d\n",stack->data[i].name, stack->data[i].age);
}
}
//清空一个栈
void clearStack(stuStack *stack)
{
stack->top = -1;
}
int main(int argc, char * argv[])
{
stuStack test;
initStack(&test);//初始化一个栈
printf("栈是否为空?\t%d\n", isEmpty(&test));
printf("栈是否为满?\t%d\n",isFull(&test));
Stu r,s,t;
strcpy(r.name,"pp");
r.age = 24;
strcpy(s.name,"eason");
s.age = 41;
strcpy(t.name,"yy");
t.age = 26;
printf("进行三次入栈操作\n");
pushStack(&test, &r);
pushStack(&test, &s);
pushStack(&test, &t);
printf("栈的元素个数:%d\n",stackSize(&test));
printf("栈是否为空?\t%d\n", isEmpty(&test));
printf("栈是否为满?\t%d\n",isFull(&test));
printf("栈顶元素地址:%x\n", getTop(&test));
printf("栈顶元素的值:\n");
printf("%s\t%d\n",getTop(&test)->name,getTop(&test)->age);
printf("遍历栈中元素:\n");
visitStack(&test);
printf("出栈成功?\t%d\n",popStack(&test));
printf("此时,栈顶元素的值:\n");
printf("%s\t%d\n",getTop(&test)->name,getTop(&test)->age);
printf("此时,遍历栈中元素:\n");
visitStack(&test);
printf("执行清空栈的操作\n");
clearStack(&test);
printf("此时对栈进行遍历:\n");
visitStack(&test);
printf("此时栈的为空?\t%d\n",isEmpty(&test));
printf("此时栈中元素个数?\t%d\n",stackSize(&test));
getchar();
return 0;
}
Ctrl+F5执行的结果如下: