上一篇文章对栈做了简要描述并使用链表实现了栈,接着,使用数组来模拟栈,两者做个对比。
代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_SIZE 1000 //暂定为1000
//定义数组矩阵结构体
typedef struct
{
int *data;
int size;
}ArrarStack;
//构造函数
ArrarStack *CreatArrarStack()
{
ArrarStack *stack = (ArrarStack *)malloc(sizeof(ArrarStack));
stack->data = (int *)malloc(sizeof(int)*MAX_SIZE);
stack->size = 0;
return stack;
}
//析构函数
void delArrarStack(ArrarStack *stack)
{
free(stack->data);
free(stack);
}
//获取栈的长度
int size(ArrarStack *stack)
{
return stack->size;
}
//判断栈是否为空
bool isEmpty(ArrarStack *stack)
{
return stack->size == 0;
}
//入栈
void push(ArrarStack *stack, int num)
{
if(stack->size == MAX_SIZE)
{
printf("栈已满\n");
return ;
}
stack->data[stack->size++] = num;
}
//访问栈顶元素
int gettop(ArrarStack *stack)
{
if(stack->size == 0)
{
printf("栈为空\n");
return INT_MAX;
}
return stack->data[stack->size-1];
}
//出栈
int pop(ArrarStack *stack)
{
int val = gettop(stack);
stack->size--;
return val;
}
//打印栈
void Print(ArrarStack *stack)
{
int i=stack->size-1;
while(i>=0)
{
printf("\t%d\n",stack->data[i]);
i--;
}
printf("************\n");
}
int main()
{
ArrarStack *stack = CreatArrarStack(); //创建栈
char op[10];
while(scanf("%s",op)!=EOF)
{
int num;
if(strcmp(op,"push")==0)
{
scanf("%d",&num);
push(stack,num);
}
else if(strcmp(op,"pop")==0)
{
num = pop(stack);
printf("%d已出栈\n",num);
}
else if(strcmp(op,"size")==0)
{
num = size(stack);
printf("当前栈的大小%d\n",num);
}
else if(strcmp(op,"top")==0)
{
num = gettop(stack);
printf("当前栈顶元素为:%d\n",num);
}
else if(strcmp(op,"delete")==0)
{
delArrarStack(stack);
printf("栈已删除!\n");
}
else if(strcmp(op,"show")==0)
{
Print(stack);
}
}
return 0;
}
测试:
输入:
push 1
push 3
push 5
push 7
showpop
size
pop
size
top
show
delete
输出:
7
5
3
1
************
7已出栈
当前栈的大小3
5已出栈
当前栈的大小2
当前栈顶元素为:3
3
1
************
栈已删除!