(1) 定义栈的顺序存取结构。
(2) 分别定义顺序栈的基本操作(初始化栈、判栈空、入栈、出栈等)。
(3) 设计一个测试主函数进行测试。
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define size 100//定义宏,可自行修改size
/*
顺序栈的实现
*/
typedef struct Stack
{
int* base;//栈底指针(尾指针)
int* top;//栈顶指针(头指针)
int stacksize;//栈的初始空间大小
}STACK,*PSTACK;
//初始化栈
int init_stack(PSTACK p);
//入栈,压栈
int Push(PSTACK p, int e);
//遍历
void traverse_stack(PSTACK p);
//出栈
int Pop(PSTACK p, int* e);
//获取栈顶元素
int GetTop(PSTACK p, int* e);
int main(void)
{
STACK stack;
int val;//记录出栈元素
int valtop;//记录栈顶元素
init_stack(&stack);
Push(&stack, 1);
Push(&stack, 2);
Push(&stack, 3);
Push(&stack, 4);
traverse_stack(&stack);
Pop(&stack, &val);
traverse_stack(&stack);
GetTop(&stack, &valtop);
}
int init_stack(PSTACK p)
{
p->base = (int*)malloc(size*sizeof(int));//申请size个int空间,指向base
if (NULL == p->base)
{
printf("栈空间分配失败!\n");
exit(-1);
}
p->top = p->base;
p->stacksize = size;
return 1;//1表示初始化成功
}
int Push(PSTACK p, int e)
{
if (p->top - p->base == p->stacksize)//栈满判断
{
p->base = (int*)realloc(p->base, (p->stacksize + 1) * sizeof(int));
if (NULL == p->base)
{
printf("栈空间分配失败!\n");
exit(-1);
}
p->top = p->base + p->stacksize;//让top指向新分配的空间
p->stacksize += 1;
}
*p->top++ = e;
//*p->top = e;
//p->top++;
printf("%d进栈成功!\n", e);
return 1;//1表示进栈成功
}
void traverse_stack(PSTACK p)
{
int* pNew = p->base;
while(pNew != p->top)
{
printf("%d", *pNew);
pNew++;
}
printf("\n");
}
int Pop(PSTACK p, int* e)
{
if (p->top == p->base)//栈空判断
return 0;
*e = *--p->top;
printf("%d出栈成功!\n",*e);
return 1;//1表示出栈成功
}
int GetTop(PSTACK p, int* e)
{
if (p->top == p->base)//栈空判断
return 0;
*e = *(p->top - 1);
printf("栈顶元素为:%d\n", *e);
return 1;
}