C语言实现栈的示例代码

目录
  • 一、了解栈的结构特点
  • 二、具体实现
  • 补充 栈的用处

一、了解栈的结构特点

栈是一种特殊的线性表,只允许从一端进出数据,称为后进先出,先进后出。

压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶

出栈:栈的删除操作叫做出栈。出数据也在栈顶

二、具体实现

由于栈实质是一种线性表,因此可以用两种方式来实现:顺序表  或  链表

这里我使用的是类似顺序表的方式来实现。

代码如下:

typedef char Stacktype;
typedef struct Stack
{
    int top;
    Stacktype* data;
    int capacity;
}Stack;

void Stack_init(Stack* pphead);         //栈的初始化
void Stack_destory(Stack* pphead);      //栈的清空
void Stack_push(Stack* pphead, Stacktype data);  //插入数据,压栈
void Stack_pop(Stack* pphead);          //出栈(删除数据)
bool Stack_Empty(Stack* pphead);        //判断栈是否为空
Stacktype Stack_Top(Stack* pphead);     //调出栈顶元素
int Stack_Size(Stack* pphead);          //查看数据个数

//栈的初始化
void Stack_init(Stack* pphead)
{

    pphead->top = 0;
    pphead->capacity = 0;
    pphead->data = NULL;
}
//栈的清空
void Stack_destory(Stack* pphead)
{
    pphead->top = 0;
    pphead->capacity = 0;
    free(pphead->data);
    pphead->data = NULL;
}
//插入数据,压栈
void Stack_push(Stack* pphead, Stacktype data)
{
    assert(pphead);
    if (pphead->top == pphead->capacity)
    {
        int Newcapacity = (pphead->capacity == 0) ? 4 : ((pphead->top) * 2);
        Stacktype* temp = NULL;
        temp = (Stacktype*)realloc(pphead->data, sizeof(Stacktype) * Newcapacity);
        if (temp == NULL)
        {
            printf("Stack_push");
            exit(-1);
        }
        pphead->data = temp;
        pphead->top = Newcapacity;
    }
    (pphead->data)[pphead->capacity] = data;
    pphead->capacity++;
}
//出栈(删除数据)
void Stack_pop(Stack* pphead)
{
    assert(pphead);
    assert(Stack_Empty(pphead));
    pphead->capacity--;
}
//判断栈是否为空
bool Stack_Empty(Stack* pphead)
{
    assert(pphead);
    return pphead->capacity != 0;
}
//调出栈顶元素
Stacktype Stack_Top(Stack* pphead)
{
    assert(pphead);
    assert(Stack_Empty(pphead));
    return pphead->data[pphead->capacity - 1];
}
//查看数据个数
int Stack_Size(Stack* pphead)
{
    assert(pphead);
    return pphead->top;
}

补充 栈的用处

我们好不容易实现了一个栈,接下来我们来做个题看看栈有什么用吧。

题目描述

给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。

左括号必须以正确的顺序闭合。

基础框架

C语言的基础框架如下

bool isValid(char * s){

​​​​​​​}

解题思路

左括号一定要和右括号对齐,非常满足栈的特性

我们可以将所有的左括号存入一个栈中。

然后遇到右括号,就出栈,判断是否匹配。

直到栈为空且字符串中的括号也遍历完了,那么所有括号就正确的匹配了。

代码详解

// 1.因为C语言并没有现成的栈,所以我们需要自己造轮子,先写个栈再说
typedef char STDateType; // 更改数据类型为char

typedef struct Stack
{
	STDateType* a;
	int top;
	int capacity;
}Stack;

void StackInti(Stack* ps)
{
	assert(ps);

	ps->a = NULL;
	ps->capacity = 0;
	ps->top = 0;
}

void StackDestory(Stack* ps)
{
	assert(ps);

	free(ps->a);
	ps->capacity = 0;
	ps->top = 0;
}

void StackPush(Stack* ps, STDateType x)
{
	assert(ps);
	if (ps->top == ps->capacity)
	{
		int newCapcity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		ps->a = (int*)realloc(ps->a, sizeof(int) * newCapcity);
		if (ps->a == NULL)
		{
			printf("ralloc error");
			exit(-1);
		}
		ps->capacity = newCapcity;
	}

	ps->a[ps->top] = x;
	ps->top++;
}

void StackPop(Stack* ps)
{
	assert(ps);
	assert(ps->top > 0);

	ps->top--;
}

bool StackEmpty(Stack* ps)
{
	assert(ps);
	return ps->top == 0;
}

STDateType StackTop(Stack* ps)
{
	assert(ps);
	assert(ps->top > 0);

	return ps->a[ps->top - 1];
}

bool isValid(char * s){
    Stack a;
    StackInti(&a);
    while(*s)
    {
        if (*s == '(' || *s == '[' || *s == '{') //入栈
        {
            StackPush(&a, *s);
        }
        else //出栈
        {
            if(StackEmpty(&a)) //右括号多一个的情况
            {
                return false;
            }

            char tmp = StackTop(&a);
            StackPop(&a);
            if ((*s == ')' && tmp != '(')
              ||(*s == ']' && tmp != '[')
              ||(*s == '}' && tmp != '{') )
            {
                return false;
            }
        }
        s++;
    }
    return StackEmpty(&a); //防止出现多一个左括号的情况
}

到此这篇关于C语言实现栈的示例代码的文章就介绍到这了,更多相关C语言实现栈内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言数组栈实现模板

    本文实例为大家分享了C语言数组栈实现模板的具体代码,供大家参考,具体内容如下 SeqStack.h #pragma once #define MAX_SIZE 1024 typedef struct SEQSTACK { void* data[MAX_SIZE]; int size; }SeqStack; SeqStack* Init_SeqStack(); // 初始化栈 void Push_SeqStack(SeqStack* stack, void* data); // 入栈 void*

  • C语言详解如何实现顺序栈

    目录 顺序栈的定义 顺序栈的理解 准备工作 具体实现 今天说的是关于数据结构顺序栈的一些基本操作c语言实现. 顺序栈的定义 首先,我们先来简单了解一下顺序栈,前面线性表我们知道,根据顺序存储或者链式存储分为顺序表和单链表,同样的,根据存储方式的不同,我们把栈分为顺序存储的栈称为顺序栈,链式存储的栈称为链栈.我们要讲的就是顺序栈.实际上,有了前面线性表的一些知识后,关于栈的操作我们还是比较容易理解的. 顺序栈的理解 问题来了?我们怎么去定义呢?通常我们可以用一个数组和记录栈顶元素位置的变量组成,栈

  • C语言超详细讲解栈的实现及代码

    目录 前言 栈的概念 栈的结构 栈的实现 创建栈结构 初始化栈 销毁栈 入栈 出栈 获取栈顶元素 获取栈中有效元素个数 检测栈是否为空 总代码 Stack.h 文件 Stack.c 文件 Test.c 文件 前言 栈的概念 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作.进行数据插入和删除操作的一端称为栈顶,另一端称为栈底.栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则.有点类似于手枪弹夹,后压进去的子弹总是最先打出,除非枪坏了. 压栈:栈的插入

  • C语言之实现栈的基础创建

    栈:是限定仅在表尾进行插入和删除操作的线性表! 栈的结构定义如下: typedef struct Stack { SLDataType *base;//栈底元素的地址 int top;//栈顶元素的位置 } Stack; 栈的初始化如下: SLDataType initStack(Stack &S) { S.base=(SLDataType*)malloc(N*sizeof(SLDataType));//申请栈元素的存储空间 if(S.base==NULL) return -1; S.top=0

  • C语言 栈与数组的实现详解

    目录 栈的实现 栈的定义 数组实现 静态栈 动态栈 链栈 栈的实现 首先我们思考一个问题,什么是栈? 栈是数据结构的一种,栈在我们日常编码中遇到的非常多,很多人对栈的接触可能仅仅局限在 递归使用的是栈 和 StackOverflowException,栈是一种后进先出的数据结构(可以想象生化金字塔的牢房和生化角斗场的狗洞). 栈的定义 栈(stack)又名堆栈,它是一种运算受限的线性表.限定仅在表尾进行插入和删除操作的线性表.这一端被称为栈顶,相对地,把另一端称为栈底.向一个栈插入新元素又称作进

  • C语言中栈的两种实现方法

    栈的两种实现方式 通常情况下,栈的实现方式有两种,一种方法是使用指针,而另一种方法则是使用数组.但是在调用程序时,我们没有必要知道具体使用了哪种方法. 一.顺序栈 #include<stdio.h> #include<stdlib.h> #define maxsize 64 //定义栈 typedef struct { int data[maxsize]; int top; }sqstack,*sqslink; //设置栈空 void Clearstack(sqslink s) {

  • C语言实现链栈的步骤

    链栈图解 链栈的常规操作 /********************* 链栈的常规操作 ****************************/ LinkStack InitLinkStack(); // 初始化链栈 int StackEmpty(); // 判断链栈空 int StackLength(); // 求链栈长(链栈元素个数) int Push(); // 入栈 压栈 ElemType Pop(); // 出栈 弹栈 void DestroyStack(); // 销毁链栈 /**

  • C语言实现栈的示例代码

    目录 一.了解栈的结构特点 二.具体实现 补充 栈的用处 一.了解栈的结构特点 栈是一种特殊的线性表,只允许从一端进出数据,称为后进先出,先进后出. 压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶 出栈:栈的删除操作叫做出栈.出数据也在栈顶 二.具体实现 由于栈实质是一种线性表,因此可以用两种方式来实现:顺序表  或  链表 这里我使用的是类似顺序表的方式来实现. 代码如下: typedef char Stacktype; typedef struct Stack { int top; S

  • C语言实现栈的示例详解

    目录 前言 一. 什么是栈 二. 使用什么来实现栈 三. 栈的实现 3.1 头文件 3.2 函数实现 3.3 完整代码 四. 栈的用处 前言 前一段时间,我们试着用C语言实现了数据结构中的顺序表,单链表,双向循环链表.今天我们再用C语言来实现另一种特殊的线性结构:栈 一. 什么是栈 栈(stack)又名堆栈,它是一种运算受限的线性表.限定仅在表尾进行插入和删除操作的线性表.这一端被称为栈顶,相对地,把另一端称为栈底.向一个栈插入新元素又称作进栈.入栈或压栈,它是把新元素放到栈顶元素的上面,使之成

  • C语言责任链模式示例代码

    目录 介绍: 作用: 类比: 示例: 总结 介绍: ​ 责任链模式是一种行为模式,它可以允许你将请求沿着处理者链进行发送,收到请求以后, 每个处理者均可对请求进行处理, 或将其传递给链上的下个处理者: 作用: 将请求按照链的方式一一传递 类比: ​ 公司申请报销,首先要leader审批通过,然后是HR,再然后是财务,最后是老板,一级一级的将请求传递: 示例: #include <stdio.h> #include <assert.h> #include "list.h&q

  • Go语言实现枚举的示例代码

    在编程领域里,枚举用来表示只包含有限数量的固定值的类型,在开发中一般用于标识错误码或者状态机.拿一个实体对象的状态机来说,它通常与这个对象在数据库里对应记录的标识状态的字段值相对应. 在刚开始学编程的时候,你一定写过,至少见过直接使用魔术数字进行判断的代码.啥叫魔术数字呢,举个例子,要置顶一个文章的时候先判断文章是不是已发布状态. if (article.state == 2) {    // state 2 代表文章已发布 } 假如我们的代码里没有注释,或者等我们项目的代码里充斥着这些魔术数字

  • C语言打印杨辉三角形的示例代码

    目录 1. 题目描述 2. 解题思路 3. 动图演示 4. 代码实现 Step1 Step2 居中显示 5. 完整代码 6. 特性总结 1. 题目描述 杨辉三角形 解题之前,我们先来了解一下杨辉三角形到底是什么? 杨辉三角形,又称帕斯卡三角形.贾宪三角形.海亚姆三角形,它的排列形如三角形. 因为首现于南宋杨辉的<详解九章算法>得名,而书中杨辉说明是引自贾宪的<释锁算书>,故又名贾宪三角形. 古代波斯数学家欧玛尔·海亚姆也描述过这个三角形.在欧洲,因为法国数学家布莱兹‧帕斯卡在165

  • C语言进阶栈帧示例详解教程

    目录 正片开始 栈有什么用? 寄存器 main函数创建 局部变量创建 函数部分 形参与实参 正片开始 今天来讲讲我对栈帧创建与销毁的拙见.理解什么是栈帧首先知道什么是栈: 在数据结构中, 栈是限定仅在表尾进行插入或删除操作的线性表.栈是一种数据结构,它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据. 栈有什么用? 在计算机系统中,栈也可以称之为栈内存是一个具有动态内存区域,存储函数内部(包括main函数)的局部变量和方法调用和函数参数值,

  • go语言实现屏幕截图的示例代码

    目录 借助第三方库 安装 自定义截图 Capture 全屏截图 CaptureDisplay 获取活动显示器数量 NumActiveDisplays 获取指定屏幕显示范围 GetDisplayBounds 获取自定义矩形区域的截图 CaptureRect 演示 借助第三方库 https://github.com/kbinani/screenshot 安装 go get github.com/kbinani/screenshot 方法 详情查看https://pkg.go.dev/github.c

  • C语言实现通讯录的示例代码

    目录 一.Contact.h文件 二.Contact.c文件 三.test.c文件 一.Contact.h文件 包含函数的声明 #pragma once #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <assert.h> #define MAX 100 #define MAX_NAME 20 #defi

  • c语言中&的用法示例代码

    1.用于指针赋值 #include<stdio.h> int main() { int a = 2; int*b;//定义一个整形指针 b = &a;//给指针赋值,使指针指向a的地址 printf("%d", b);//输出的是a的地址 printf("\n");//换行符 printf("%d", *b);//*的作用是解引用,取出指针指向地址的内容,达到简 return 0; } 2.用于二目运算中的按位(位运算)与运算

  • C语言示例代码讲解栈与队列

    目录 栈 栈的定义 顺序栈 顺序栈的定义 顺序栈的初始化 顺序栈的入栈 顺序栈的出栈 取顺序栈的栈顶元素 链栈 队列 队列的定义 队列的顺序表达与实现 队列顺序存储结构 假溢出 循环队列 循环队列的初始化 循环队列的入队 循环队列的出队 链队列 链栈的初始化 链栈的入队 链栈的出队 上文详细的讲解了顺序表与链表的实现,相信大家在顺序表与链表的指基础上,很容易就能学会站和队列,废话不多说,我们马上开始! 栈 栈的定义 栈是一种线性表,但限定这种线性表只能在某一端进行插入和删除操作 假设栈 [s =

随机推荐