1.算法原理分析如下图:
2.栈的顺序存储代码
要依赖于上一篇文章中的seqlist_02.h和seqlist_02.cpp 线性表的顺序存储(业务结点和算法逻辑分离)
seqstack.h代码如下:
// seqstack.h
#ifndef _MY_SEQSTACK_H_
#define _MY_SEQSTACK_H_
typedef void SeqStack;
typedef void SeqStackNode;
//直接在该函数里调用顺序表中的函数就可以了
SeqStack* SeqStack_Create(int capacity);
//直接在该函数里调用顺序表中的函数就可以了
void SeqStack_Destroy(SeqStack* stack);
//直接在该函数里调用顺序表中的函数就可以了
void SeqStack_Clear(SeqStack* stack);
//和线性表的插入元素相同 只是限定了在表尾进行插入
int SeqStack_Push(SeqStack* stack, void* item);
//和线性表删除元素相同 只是限制了在表尾进行删除
void* SeqStack_Pop(SeqStack* stack);
//和线性表获取元素相同,只是限制了在表尾获取元素
void* SeqStack_Top(SeqStack* stack);
//直接在该函数里调用顺序表中的函数就可以了
int SeqStack_Size(SeqStack* stack);
直接在该函数里调用顺序表中的函数就可以了
int SeqStack_Capacity(SeqStack* stack);
#endif //_MY_SEQSTACK_H_
seqstack.cpp如下
#include<iostream>
#include"seqstack.h"
#include"seqlist_02.h"
SeqStack* SeqStack_Create(int capacity)
{
return SeqList_Create(capacity);
}
void SeqStack_Destroy(SeqStack* stack)
{
SeqList_Destroy(stack);
}
void SeqStack_Clear(SeqStack* stack)
{
SeqList_Clear(stack);
}
int SeqStack_Push(SeqStack* stack, void* item)
{
int ret = SeqList_Insert(stack,item,SeqList_Length(stack));
return ret;
}
void* SeqStack_Pop(SeqStack* stack)
{
void *temp = SeqList_Delete(stack, SeqList_Length(stack)-1);
return temp;
}
void* SeqStack_Top(SeqStack* stack)
{
void *temp = SeqList_Get(stack, SeqList_Length(stack)-1);
return temp;
}
int SeqStack_Size(SeqStack* stack)
{
return SeqList_Length(stack);
}
int SeqStack_Capacity(SeqStack* stack)
{
return SeqList_Capacity(stack);
}
测试程序代码如下:
#include "seqstack.h"
#include<iostream>
//自己定义业务结点
typedef struct tag_Student
{
char name[30];
int age;
}Student;
int main(int argc,char*argv[])
{
Student s1;
Student s2;
Student s3;
s1.age = 11;
s2.age = 12;
s3.age = 13;
SeqStack *handle = SeqStack_Create(20);
SeqStack_Push(handle, (SeqStackNode*)&s1);
SeqStack_Push(handle, (SeqStackNode*)&s2);
SeqStack_Push(handle, (SeqStackNode*)&s3);
Student* tmp = (Student*)SeqStack_Top(handle);
printf("栈顶元素的值是[%d]\n",tmp->age);
//遍历删除元素
while (SeqStack_Size(handle) > 0)
{
Student* tmp = (Student*)SeqStack_Pop(handle);
printf("被删除元素的值是[%d]\n", tmp->age);
}
SeqStack_Clear(handle);
SeqStack_Destroy(handle);
return 0;
}
输出结果截图如下: