目录
学习-模仿-创新
在有了写线性表的基础后,自己花了2个小时也成功写出了栈的基本函数
如果有错误,请自己修改一下QAQ
本人博客 恒毅的小窝
顺序栈
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define maxsize 30
typedef struct node
{
int* base;
int* top;
int stacksize;
}Stack;
void InitStack(Stack* S)
{
S->base = (int*)malloc(sizeof(int) * maxsize);//给栈分配数组空间
if (!S->base)//判断没有开拓新空间
exit(0);
S->top = S->base;
S->stacksize = maxsize;
}//初始化栈
void PushStack(Stack* S, int elem)
{
*S->top= elem;//先入
S->top = S->top + 1;//往上移一个
}//入栈
int PopStack(Stack* S)
{
int elem;
*S->top = *S->top - 1;
elem = *S->top; //栈顶指针先减一,再将栈顶元素出栈
return elem;
}//出栈
void GetStack_len(Stack* S)
{
int len;
len = S->top - S->base;
printf("%d个数\n", len);
}//得到长度
void ClearStack(Stack* S)
{
S->top = S->base;
}//清空
void DestroyStack(Stack* S)
{
S->top = S->base;
free(S->base);
S->stacksize = 0;
}//销毁栈
int CapacityStack(Stack* S)
{
return S->stacksize;
}//栈的容载能力
int * TopStack(Stack* S)
{
return S->top;
}//返回Top指针
void PrintStack(Stack* S)
{
if (S->base == S->top) {
printf("栈为空!");
}
int* p;
p = S->top;
printf("输出栈中所有数据:\n");
while (p > S->base) {
p--;
printf("%d\n", *p);//*p表示p指向的变量值
}
}//输出
int main() {
Stack s;
InitStack(&s);
PushStack(&s, 1);
PushStack(&s, 2);
PushStack(&s, 3);
PushStack(&s, 4);
GetStack_len(&s);
PrintStack(&s);
return 0;
}
链式栈
链式栈
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<stdlib.h>
#define ERROR -1
typedef int SDataType;
typedef struct StackNode
{
SDataType Data;
struct StackNode* Next;
}Node, * PNode;//PNode为StackNode的指针
typedef struct Stack
{
PNode top;
int count;
}Stack;//指向第一个
struct StackNode* BuyStackNode() {
struct StackNode* p;
p = (StackNode*)malloc(sizeof(struct StackNode));
p->Next = NULL;
return p;
}//建立一个新的节点
void InitStack(Stack* s){
s->top= (PNode)malloc(sizeof(StackNode));
Stack*base=s;//得到最开始的指针和0个个数
if (!s->top)
exit(ERROR);
s->top = NULL;
s->count = 0;
}//栈的初始化
void PushStack(Stack* s, SDataType e) {
PNode PNewNode = BuyStackNode();
PNewNode->Data = e;
PNewNode->Next = s->top;
s->top = PNewNode;
s->count++;
printf("输入的是%d\n", e);
}//入栈
void PopStack(Stack* s) {
PNode p;
SDataType e;
if (s->top == NULL)exit(ERROR);
e = s->top->Data;
printf("删除%d\n", e);
p = s->top;
s->top = s->top->Next;
free(p);
s->count--;
}//出栈
void PrintCount(Stack* s){
printf("%d个数\n", s->count);
}//输出长度
void ClearStack(Stack* s) {
PNode p;
while (s->top != NULL) {
p = s->top;
s->top = s->top->Next;
free(p);
}
s->count = 0;
printf("已经清空栈表\n");
}//清空栈表
void GetTop(Stack* s, SDataType* e)
{
if (s->top!= NULL)
{
*e = s->top->Data;
}
else
exit(ERROR);
}//获顶
void PrintStack(Stack*s)
{
PNode p;
p = s->top;
while (p)
{
printf("%d\n",p->Data);
p = p->Next;
}
if (p == NULL)
printf("啥都没有了\n");
}//输出
int main() {
Stack s;
InitStack(&s);
PushStack(&s, 1);
PushStack(&s, 2);
PushStack(&s, 3);
PushStack(&s, 4);
PopStack(&s);
PrintCount(&s);
PrintStack(&s);
ClearStack(&s);
PrintStack(&s);
system("pause");
}
我的Github仓库
导航 数据结构