赞
踩
hello,又见面了!
目录
正文开始——
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守先进后出的原则。
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫出栈,出数据也在栈顶。
【图解】
栈的底层结构
内存比较:双向链表比单链表多了一种指针,内存占用就相对多一些;数组和单链表,数组每次都以2倍大小增容,正因如此,无需多次增容,而单链表每次增加数据都要申请空间,删除数据要释放空间,较为繁琐。
栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更好一些,因为数组在尾插数据时代价更小。
栈里的数据不能被遍历,不能被随机访问。每次取数据只能取栈顶数据
- #pragma once
- #include<stdio.h>
- #include<assert.h>
- #include<stdlib.h>
- #include<stdbool.h>
-
- //定义栈的结构
- typedef int STDataType;
- typedef struct Stack
- {
- STDataType* arr;
- int capacity; //栈的容量
- int top; //栈顶
- }ST;
-
- //初始化
- void STInit(ST* ps);
-
- //销毁
- void STDestroy(ST* ps);
-
- //入数据
- void StackPush(ST* ps, STDataType x);
-
- //出数据
- void StackPop(ST* st);
-
- //取栈顶元素
- STDataType StackTop(ST* ps);
-
- //判空
- bool StackEmpty(ST* ps);
-
- //获取栈中有效的数据个数
- int STsize(ST* ps);
-
- #define _CRT_SECURE_NO_WARNINGS 1
- #include"Stack.h"
-
- //初始化
- void STInit(ST* ps)
- {
- assert(ps);
- ps->arr = NULL;
- ps->capacity = ps->top = 0; //此时栈为空,栈顶=栈底
- }
-
- //销毁
- void STDestroy(ST* ps)
- {
- assert(ps);
- if (ps->arr)
- {
- free(ps->arr);
- }
- ps->arr = NULL;
- ps->capacity = ps->top = 0;
- }
-
- //入数据
- void StackPush(ST* ps, STDataType x)
- {
- assert(ps);
-
- //判断空间是否足够
- if (ps->capacity == ps->top)
- {
- //申请空间
- int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;
- STDataType* tmp = (STDataType*)realloc(ps->arr, newCapacity * sizeof(STDataType));
- if (tmp == NULL)
- {
- perror("realloc file!");
- exit(1);
- }
- ps->arr = tmp;
- ps->capacity = newCapacity;
- }
- //空间足够
- ps->arr[ps->top++] = x;
- }
-
- //出数据
- void StackPop(ST* ps)
- {
- assert(ps);
- assert(!StackEmpty(ps));
-
- ps->top--;
- }
-
- //判空
- bool StackEmpty(ST* ps)
- {
- assert(ps);
- return ps->top == 0;
- }
-
- //取栈顶元素
- STDataType StackTop(ST* ps)
- {
- assert(ps);
- assert(!StackEmpty(ps));
-
- return ps->arr[ps->top - 1];
- }
-
- //获取栈中有效的数据个数
- int STsize(ST* ps)
- {
- assert(ps);
- return ps->top;
- }
-
- #define _CRT_SECURE_NO_WARNINGS 1
- #include"Stack.h"
-
- void STTest()
- {
- ST st;
- STInit(&st);
-
- StackPush(&st,1);
- StackPush(&st,2);
- StackPush(&st,3);
- StackPush(&st,4);
- StackPush(&st,5);
- printf("size:%d\n", STsize(&st));
- /*StackPop(&st);*/
-
- //循环出栈,直到栈为空
- while (!StackEmpty(&st))
- {
- STDataType data = StackTop(&st);
- printf("%d ", data);
- //出栈
- StackPop(&st);
- }
- printf("size:%d\n", STsize(&st));
-
- STDestroy(&st);
- }
-
- int main()
- {
- STTest();
- return 0;
- }
【思路】
-
- //定义栈的结构
- typedef char STDataType;
- typedef struct Stack
- {
- STDataType* arr;
- int capacity; //栈的容量
- int top; //栈顶
- }ST;
-
- //初始化
- void STInit(ST* ps)
- {
- assert(ps);
- ps->arr = NULL;
- ps->capacity = ps->top = 0; //此时栈为空,栈顶=栈底
- }
-
- //销毁
- void STDestroy(ST* ps)
- {
- assert(ps);
- if (ps->arr)
- {
- free(ps->arr);
- }
- ps->arr = NULL;
- ps->capacity = ps->top = 0;
- }
-
- //入数据
- void StackPush(ST* ps, STDataType x)
- {
- assert(ps);
-
- //判断空间是否足够
- if (ps->capacity == ps->top)
- {
- //申请空间
- int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;
- STDataType* tmp = (STDataType*)realloc(ps->arr, newCapacity * sizeof(STDataType));
- if (tmp == NULL)
- {
- perror("realloc file!");
- exit(1);
- }
- ps->arr = tmp;
- ps->capacity = newCapacity;
- }
- //空间足够
- ps->arr[ps->top++] = x;
- }
-
- //判空
- bool StackEmpty(ST* ps)
- {
- assert(ps);
- return ps->top == 0;
- }
-
- //出数据
- void StackPop(ST* ps)
- {
- assert(ps);
- assert(!StackEmpty(ps));
-
- ps->top--;
- }
-
- //取栈顶元素
- STDataType StackTop(ST* ps)
- {
- assert(ps);
- assert(!StackEmpty(ps));
-
- return ps->arr[ps->top - 1];
- }
-
- bool isValid(char* s) {
- ST st;
- STInit(&st);
- char* ps=s;
- while(*ps!='\0')
- {
- //左括号,入栈
- if(*ps=='('||*ps=='['||*ps=='{')
- {
- StackPush(&st,*ps);
- }
- else //右括号,与栈顶元素判断是否匹配,匹配,出栈,不匹配,返回false
- {
- if(StackEmpty(&st))
- {
- STDestroy(&st);
- return false;
- }
- char ch=StackTop(&st);
- if(*ps==')'&&ch=='('||*ps=='}'&&ch=='{'||*ps==']'&&ch=='[')
- {
- StackPop(&st);
- }
- else
- {
- STDestroy(&st);
- return false;
- }
- }
- ps++;
- }
- bool ret=StackEmpty(&st)==true;
- STDestroy(&st);
- return ret;
- }
至此,栈,结束——
完——
至此结束——
我是云边有个稻草人
期待与你的下一次相遇 !
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。