数据结构栈的顺序表实现基本功能
1入栈
2出栈
3取栈顶元素
头文件
文件名 seqstack.h
#pragma once //防止头文件重复定义
#include<stdio.h>
#include<stdlib.h>
typedef char Seqstacktype;
typedef struct Seqstack
{
Seqstacktype* data; //数据块指针
size_t size; //当前有效数据个数
size_t capacity; //容量
}Seqstack;
//初始化
void SeqstackInit(Seqstack* stack);
//销毁
void SeqstackDestroy(Seqstack* stack);
//入栈
void SeqstackPush(Seqstack* stack, Seqstacktype value);
//出栈
void SeqstackPop(Seqstack* stack);
//扩容
void SeqstackAddsize(Seqstack* stack);
//取栈顶元素
Seqstacktype SeqstackGet(Seqstack* stack);
函数实现
文件名 seqstack.c
#include"seqstack.h"
//初始化
void SeqstackInit(Seqstack* stack)
{
if (stack == NULL)
{
printf("非法输入");
return;
}
stack->size = 0;
stack->capacity = 1000; //容量
stack->data = (Seqstacktype*)malloc(stack->capacity*sizeof(Seqstacktype)); //分配空间
}
//销毁
void SeqstackDestroy(Seqstack* stack)
{
free(stack->data); //释放指针内容
stack->size = 0; //有效数据清空
stack->capacity = 0; //容量清空
}
//扩容
void SeqstackAddsize(Seqstack* stack)
{
if (stack == NULL)
{
printf("非法输入");
return;
}
stack->capacity = stack->capacity * 2 + 1; //将容量扩大
Seqstacktype* new_ptr = (Seqstacktype*)malloc(stack->capacity*sizeof(Seqstacktype)); //申请新的空间
}
//入栈
void SeqstackPush(Seqstack* stack, Seqstacktype value)
{
if (stack == NULL)
{
printf("非法输入");
return;
}
if (stack->size >= stack->capacity) //如果当前有效数据个数 > 容量
{ //说明 栈已经满了
SeqstackAddsize(stack); //扩容
}
stack->data[stack->size++] = value;
return;
}
//出栈
void SeqstackPop(Seqstack* stack)
{
if (stack == NULL)
{
printf("非法输入");
return;
}
if (stack->size == 1) //如果当前有效数据只剩下一个
{ //出栈的同时进行销毁栈
SeqstackDestroy(stack);
return;
}
stack->size--; //出栈后,栈长度自减
}
//取栈顶元素
Seqstacktype SeqstackGet(Seqstack* stack)
{
if (stack == NULL)
{
printf("非法输入");
return 0;
}
Seqstacktype ret = stack->data[stack->size - 1]; //栈顶元素
return ret;
}
测试函数
文件名 test.c
#include"seqstack.h"
#define FUNCTION() printf("************** %s **************\n",__FUNCTION__);
//打印函数
void Printchar(Seqstack* stack, const char *msg)
{
printf("[%s]:\n", msg);
if (stack == NULL)
{
return;
}
size_t i = 0;
for (; i < stack->size; i++)
{
printf("%c", stack->data[i]);
}
printf("\n");
}
void TestInit()
{
FUNCTION();
Seqstack stack;
SeqstackInit(&stack);
printf("size expected 0,actual %lu\n", stack.size);
printf("capacity expected 1000,actual %lu\n", stack.capacity);
}
void TestPush()
{
FUNCTION();
Seqstack stack;
SeqstackInit(&stack);
SeqstackPush(&stack, 'a');
Printchar(&stack, "入栈一个元素");
SeqstackPush(&stack, 'b');
Printchar(&stack, "入栈二个元素");
SeqstackPush(&stack, 'c');
Printchar(&stack, "入栈三个元素");
SeqstackPush(&stack, 'd');
Printchar(&stack, "入栈四个元素");
}
void TestGet()
{
FUNCTION();
Seqstack stack;
SeqstackInit(&stack);
SeqstackPush(&stack, 'a');
Printchar(&stack, "入栈一个元素");
SeqstackPush(&stack, 'b');
Printchar(&stack, "入栈二个元素");
SeqstackPush(&stack, 'c');
Printchar(&stack, "入栈三个元素");
SeqstackPush(&stack, 'd');
Printchar(&stack, "入栈四个元素");
Seqstacktype ret = SeqstackGet(&stack);
printf("取栈顶元素为:[ %c ] \n", ret);
SeqstackPop(&stack);
Printchar(&stack, "出栈一个元素");
ret = SeqstackGet(&stack);
printf("取栈顶元素为:[ %c ] \n", ret);
Printchar(&stack, "出栈一个元素");
}
void TestPop()
{
FUNCTION();
Seqstack stack;
SeqstackInit(&stack);
SeqstackPush(&stack, 'a');
Printchar(&stack, "入栈一个元素");
SeqstackPush(&stack, 'b');
Printchar(&stack, "入栈二个元素");
SeqstackPush(&stack, 'c');
Printchar(&stack, "入栈三个元素");
SeqstackPush(&stack, 'd');
Printchar(&stack, "入栈四个元素");
SeqstackPop(&stack);
Printchar(&stack, "出栈一个元素");
SeqstackPop(&stack);
Printchar(&stack, "出栈两个元素");
SeqstackPop(&stack);
Printchar(&stack, "出栈三个元素");
SeqstackPop(&stack);
Printchar(&stack, "出栈四个元素");
}
int main()
{
TestInit();
TestPush();
TestPop();
TestGet();
return 0;
}