1.对于栈和队列,相比于数组和线性表,使用规则受到了限制,因此也被称为“受限线性表”。
2.对于栈类型来说,元素符合先进后出的规律,且栈中的元素不能自由遍历。
3.栈的顺序存储结构简称为顺序栈,其思想是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素。
4.在具体的实现过程中,用数组的右边作为元素栈的栈顶,这样的好处是可以避免频繁地移动数据。
SeqStack.h头文件
#ifndef SEQSTACK_H
#define SEQSTACK_H
#include<stdlib.h>
#include<stdio.h>
typedef struct SeqStack{
void* data[1024];
//用来存放数据
int size=0;
}SeqStack;
//初始化
SeqStack* Init_SeqStack();
//入栈
void Push_SeqStack(SeqStack* stack,void* data);
//返回栈顶元素
void* Top_SeqStack(SeqStack* stack);
//出栈
void Pop_SeqStack(SeqStack* stack);
//判断是否为空
int IsEmpty(SeqStack* stack);
//返回元素个数
int Size_SeqStack(SeqStack* stack);
//销毁
void FreeSpace_SeqStack(SeqStack* stack);
//清空栈
void Clear_SeqStack(SeqStack* stack);
#endif
SeqStack.c
初始化
SeqStack* Init_SeqStack(){
SeqStack* stack=(SeqStack*)malloc(sizeof(SeqStack));
for(int i=0;i<1024;i++)
stack->data[i]=NULL;
stack->size=0;
return stack;
}
入栈
void Push_SeqStack(SeqStack* stack,void* data){
if(stack==NULL)
return;
if(stack->size==1024)
return;
if(data==NULL)
return;
stack->data[stack->size]=data;
//直接用最大下标来压入,与入栈底的思路一致
stack->size++;
}
返回栈顶元素
void* Top_SeqStack(SeqStack* stack){
if(stack==NULL)
return NULL;
if(stack->size==0)
return NULL;
return stack->data[stack->size-1];
//数组下标从0开始,需要减一
}
出栈
void Pop_SeqStack(SeqStack* stack){
if(stack==NULL)
return;
if(stack->size==0)
return;
stack->size--;
//出栈时,只需要将size减1,则栈顶部的元素下标相当于直接失效!
}
判断是否为空
int IsEmpty(SeqStack* stack){
if(stack==NULL)
return -1;
if(stack->size==0)
return 1;
return 0;
}
返回元素个数
int Size_SeqStack(SeqStack* stack){
return stack->size;
}
销毁
void FreeSpace_SeqStack(SeqStack* stack){
if(stack==NULL)
return;
free(stack);
}
清空栈
void Clear_SeqStack(SeqStack* stack){
if(stack==NULL)
return;
stack->size=0;
}
如下是测试的main.cpp文件
#include <iostream>
#include <string.h>
#include "SeqStack.h"
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
typedef struct test{
string name;
int num;
}test;
int main(int argc, char** argv) {
test t1,t2;
t1.name="JSL";
t2.name="HYH";
t1.num=7371;
t2.num=7166;
SeqStack* stack= Init_SeqStack();
Push_SeqStack(stack,&t1);
Push_SeqStack(stack,&t2);
while(Size_SeqStack(stack)>0)
{
test* tt=(test*)Top_SeqStack(stack);
cout<<(tt->name)<<" is "<<(tt->num)<<" number ."<<endl;
Pop_SeqStack(stack);
//不弹出栈顶元素会死循环!
}
FreeSpace_SeqStack(stack);
return 0;
}