用顺序表实现的栈和顺序表有什么区别呢?
我们先来分析下它们的结构体
顺序表:
typedef char SeqListType;
typedef struct SeqStack{
SeqListType data[MAZ_SIZE];
size_t size;
}
MAX_SIZE是这个顺序表最多能容纳的数据
size为当前的元素的个数
栈:
typedef char SeqStackType;
typedef struct SeqStack{
SeqStackType* data;
size_t size;
size_t capacity;
}
size为栈内元素的个数
capacity为data这段内存中容纳的元素个数
1.顺序表已经定义好了最大的长度;而栈的最大长度可以进行动态扩容。
2.顺序表可以对内部元素进行各种操作,包括遍历等;而栈只有三种操作:入栈、出栈、取栈顶元素,这样可以使栈内的数据更安全。
以下为用顺序表实现栈的代码:
.c文件
#include<stdio.h>
#include<stdlib.h>
#include"SeqStack.h"
void SeqStackInit(SeqStack* stack)
{
stack->size = 0;
stack->capacity = 1000;
stack->data = (SeqStackType*)malloc(stack->capacity*sizeof(SeqStackType));
}
void SeqStackDestory(SeqStack* stack)
{
free(stack->data);
stack->size = 0;
stack->capacity = 0;
}
void SeqStackReSize(SeqStack* stack)//扩容
{
if (stack == NULL)
return;
stack->capacity = stack->capacity*2 + 1;//扩容规则自己定
SeqStackType* new_data = (SeqStackType*)malloc(stack->capacity * sizeof(SeqStackType));
//再将原来data中的数据搬运
size_t i = 0;
for(;i < stack->size; ++i)
{
new_data[i] = stack->data[i];
}
//释放原malloc的内存
free(stack->data);
stack->data = new_data;
return;
}
void SeqStackPushBack(SeqStack* stack, SeqStackType value)
{
if (stack == NULL)
return;//非法输入
if (stack->size >= stack->capacity)//判断栈满
{
SeqStackReSize(stack);//扩容
stack->data[stack->size++] = value;//入栈
}
else
{
stack->data[stack->size++] = value;//直接入栈
}
return;
}
void SeqStackPrintChar(SeqStack* stack, const char* msg)
{
printf("%s\n",msg);
size_t i = 0;
for(;i < stack->size; ++i)
{
printf("[%c]",stack->data[i]);
}
printf("\n");
return;
}
void SeqStackPopBack(SeqStack* stack)
{
if (stack == NULL)//非法输入
return;
if (stack->size == 0)//空栈
return;
--stack->size;
return;
}
int SeqStackTop(SeqStack* stack, SeqStackType* value)//返回栈顶元素的值
{
if( stack == NULL )
return 1;//0表示取值成功,1表示失败
if( stack->size == 0 )
return 1;//空栈
*value = stack->data[stack->size-1];
return 0;
}
void TestSeqStackPushBack()
{
SeqStack stack;
SeqStackInit(&stack);
SeqStackPushBack(&stack,'a');
SeqStackPushBack(&stack,'b');
SeqStackPushBack(&stack,'c');
SeqStackPushBack(&stack,'d');
SeqStackPrintChar(&stack,"入栈");
}
void TestSeqStackPopBack()
{
SeqStack stack;
SeqStackInit(&stack);
SeqStackPushBack(&stack,'a');
SeqStackPushBack(&stack,'b');
SeqStackPushBack(&stack,'c');
SeqStackPushBack(&stack,'d');
printf("%d\n",stack.size);
SeqStackPopBack(&stack);
printf("%d\n",stack.size);
SeqStackPrintChar(&stack,"出栈");
}
void TestSeqStackTop()
{
SeqStack stack;
SeqStackInit(&stack);
SeqStackPushBack(&stack,'a');
SeqStackPushBack(&stack,'b');
SeqStackPushBack(&stack,'c');
SeqStackPushBack(&stack,'d');
SeqStackType value ;
int temp = SeqStackTop(&stack, &value);
if(temp == 0)//取栈顶元素成功
{
printf("栈顶元素是:%c\n",value);
}
else
{
printf("取栈顶元素失败\n");
}
}
int main()
{
TestSeqStackPushBack();
TestSeqStackPopBack();
TestSeqStackTop();
return 0;
}
.h文件
#pragma once
#include<stdio.h>
typedef char SeqStackType;
typedef struct SeqStack
{
SeqStackType* data;
size_t size;
size_t capacity;
}SeqStack;
//栈初始化
void SeqStackInit(SeqStack* stack);
//栈的销毁
void SeqStackDestory(SeqStack* stack);
//实现栈的动态扩容
void SeqStackReSize(SeqStack* stack);//扩容
//入栈
void SeqStackPushBack(SeqStack* stack, SeqStackType value);
//打印栈
void SeqStackPrintChar(SeqStack* stack, const char* msg);
//出栈
void SeqStackPopBack(SeqStack* stack);
//取栈顶元素
int SeqStackTop(SeqStack* stack, SeqStackType* value);//返回栈顶元素的值
测试结果如下: