【C语言】顺序栈与链式栈的基本函数

学习-模仿-创新

在有了写线性表的基础后,自己花了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仓库

导航 数据结构

猜你喜欢

转载自blog.csdn.net/weixin_51485807/article/details/115110313