栈符合先进后出的原则;
顺序栈顺序表的尾插头删;
链表栈单链表的头插头删;
一,顺序栈
#pragma once
typedef int Elemtype;
//顺序表的尾插形成了顺序栈
typedef struct Stack
{
Elemtype* base;
int top;
int stacksize;
}Stack,*Pstack;
//初始化函数(相当于顺序表的尾插)
void Init(Stack*plist);
//入栈
bool Push(Stack* plist,Elemtype *val);
//出栈(出栈的话需要告诉出栈的值)
bool pop(Stack* plist, Elemtype* rval);
//获取栈顶元素
bool Top(Stack* plist, Elemtype* rval);
//获取有效数据个数
int Get_length(Stack* plist);
//判空
bool Is_empty(Stack* plist);
//判满
bool Is_full(Stack*plist);
//扩容函数
bool Inc(Stack* plist);
//清空
void Clear(Stack*plist);
//销毁
void Destory(Stack* plist);
//打印
void Show(Stack*plist);
.cpp文件
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include"stack.h"
#define cursize 10
#define multiple 1.5
//初始化函数(相当于顺序表的尾插)
void Init(Stack* plist)
{
assert(plist!=nullptr);
plist->base = (Elemtype*)malloc(sizeof(Elemtype) * cursize);
assert(plist->base!=nullptr);
plist->top = 0;
plist->stacksize = cursize;
}
//入栈
bool Push(Stack* plist, Elemtype val)
{
assert(plist != nullptr);
if (Is_full(plist) && !Inc(plist))
{
return false;
}
plist->base[plist->top++] =val;
return true;
}
//出栈(出栈的话需要告诉出栈的值)
bool pop(Stack* plist, Elemtype* rval)
{
Is_empty(plist);
*rval = plist->base[--plist->top];
return true;
}
//获取栈顶元素
bool Top(Stack* plist, Elemtype* rval)
{
*rval = plist->base[plist->top - 1];
return true;
}
//获取有效数据个数
int Get_length(Stack* plist)
{
return plist->top;
}
//判空
bool Is_empty(Stack* plist)
{
return plist->top == 0;
}
//判满
bool Is_full(Stack* plist)
{
assert(plist!=nullptr);
return plist->top>=plist->stacksize;
}
//扩容函数
bool Inc(Stack* plist)
{
int size = plist->stacksize * multiple;
Elemtype* newbase = (Elemtype*)realloc(plist->base,sizeof(Elemtype)* size);
if (nullptr == newbase) return false;
plist->base = newbase;
plist->stacksize = size;
}
//清空
void Clear(Stack* plist)
{
plist->top = 0;
}
//销毁
void Destory(Stack* plist)
{
plist->top = 0;
free(plist->base);
plist->base = nullptr;
}
//打印
void Show(Stack* plist)
{
for (int i = 0; i < plist->top; i++)
{
printf("%d ", plist->base[i]);
}
printf("\n");
}
int main()
{
Stack a;
Init(&a);
for (int i = 0; i < 12; i++)
{
Push(&a,i + 1);
}
Show(&a);
Elemtype rval;
Top(&a, &rval);
printf("%d\n",rval);
pop(&a,&rval);
printf("%d\n", rval);
Show(&a);
Top(&a, &rval);
printf("%d\n", rval);
return 0;
}
2,
二,链表栈
1,头文件
#pragma once
typedef int Elemtype;
typedef struct Lstack
{
Elemtype data;
struct Lstack* next;
}Stack,*Pstack;
//初始化函数(相当于顺序表的尾插)
void Init(Stack* plist);
//入栈(出栈的话需要告诉出栈的值)
bool Push(Stack* plist, Elemtype* val);
//出栈
bool pop(Stack* plist, Elemtype* rval);
//获取栈顶元素
bool Top(Stack* plist, Elemtype* rval);
//获取有效数据个数
int Get_length(Stack* plist);
//判空
bool Is_empty(Stack* plist);
//判满
bool Is_full(Stack* plist);
//清空
void Clear(Stack* plist);
//销毁
void Destory(Stack* plist);
//打印
void Show(Stack* plist);
.p文件
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include"lstack.h"
Stack* Buynode()
{
return (Stack*)malloc(sizeof(Stack));
}
//初始化函数(相当于顺序表的尾插)
void Init(Stack* plist)
{
//plist= Buynode();
plist->next = nullptr;
plist->data =0;
printf("%d\n", plist->data);
}
//入栈
bool Push(Stack* plist, Elemtype val)
{
assert(plist != nullptr);
Stack* s = Buynode();
if (s == nullptr) return false;
s->data = val;
s->next = plist->next;
plist->next = s;
plist->data+=1;
printf("入栈成功plist->data%d\n",plist->data);
return true;
}
//出栈(出栈的话需要告诉出栈的值)
bool pop(Stack* plist, Elemtype* rval)
{
assert(plist!=nullptr);
if (Is_empty(plist)) return false;
*rval = plist->next->data;
Stack* p = plist->next;
plist->next = p->next;
free(p);
p =nullptr;
plist->data -= 1;
return false;
}
//获取栈顶元素
bool Top(Stack* plist, Elemtype* rval)
{
assert(plist!=nullptr);
if (Is_empty(plist)) return false;
*rval = plist->next->data;
return true;
}
//获取有效数据个数
int Get_length(Stack* plist)
{
assert(plist!=nullptr);
return plist->data;
}
//判空
bool Is_empty(Stack* plist)
{
assert(plist != nullptr);
return plist->next==NULL;
}
//清空
void Clear(Stack* plist)
{
assert(plist != nullptr);
plist->data = 0;
plist->next = nullptr;
}
//销毁
void Destory(Stack* plist)
{
assert(plist != nullptr);
while (plist->data != 0)
{
Stack* p = plist->next;
plist->next = p->next;
free(p);
p = nullptr;
plist->data -= 1;
}
}
//打印
void Show(Stack * plist)
{
assert(plist != nullptr);
Stack* s = plist->next;
for (s; s != nullptr; s = s->next)
{
printf("%d ",s->data);
}
printf("\n");
}
int main()
{
Stack a;
Init(&a);
for (int i = 0; i <5; i++)
{
Push(&a,i+1);
}
Show(&a);
int b = 0;
Top(&a, &b);
printf("%d\n",b);
pop(&a, &b);
printf("%d\n", b);
int length = Get_length(&a);
printf("%d\n",length);
return 0;
}