在c语言中,当处理大量数据时,常有stack overflow 或者runtime error等问题,请问怎样解决啊

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在c语言中,当处理大量数据时,常有stack overflow 或者runtime error等问题,请问怎样解决啊相关的知识,希望对你有一定的参考价值。

我在学数据结构,有的是vc++,在编程时经常采用malloc动态分配内存,但仍然出现stack overflow。有什么办法在程序中清空缓存呢?

使用库函数的stack时应该有上限的,你可以尝试自己写一个stack,预先设定一个初始化最大值,每当存满的时候用realloc函数再次分配内存,就不会出现了,毕竟自己的东西没限制 参考技术A 堆栈溢出啊,TURBOC的堆栈空间是有限的,最大好象是64K,如果要处理的数据太多,动态分配内存也不一定能解决,应该切割处理数据,把处理的数据分成小的模块,分块入栈处理吧 参考技术B 使用动态分配内存。

栈(Stack)顺序栈以及链栈的相关操作(C语言)

一、栈(Stack)

(一)、定义

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

1. 栈的定义

  • 线性表是具有相同数据类型的n(n>=0)个数据元素的有限序列,其中n为表长,当n=0时线性表是一个空表。若用L命名线性表,则其一般表示为
  • L = (a1,a2,…,ai,ai+1,…,an)
  • 栈(Stack)只允许在一端进行插入或删除操作线性表
    在这里插入图片描述
    在这里插入图片描述
  • 特点:后进先出
  • Last In First Out(LIFO

2. 基本操作

  • InitStack(&S)初始化栈。构造一个空栈 S,分配内存空间
  • DestroyStack(&S)销毁栈。销毁并释放栈 S 所占用的内存空间
  • Push(&S,x)进栈,若栈S未满,则将x加入使之成为新栈顶
  • Pop(&S,&x)出栈,若栈S非空,则弹出栈顶元素,并用x返回。【删除栈顶元素】
  • GetTop(S, &x)读栈顶元素。若栈 S 非空,则用 x 返回栈顶元素【不删除栈顶元素】
  • StackEmpty(S):判断一个栈 S 是否为空。若S为空,则返回true,否则返回false。

3. 栈的常考题型

  • 进栈顺序:a -> b -> c -> d -> e,有哪些合法的出栈顺序?
    在这里插入图片描述

二、顺序栈

(一)、定义

  • 概念:用顺序存储方式实现的栈。
  • 代码实现栈的定义
#define MaxSize 10			//定义栈中元素的最大个数
typedef struct{
	ElemType data[MaxSize];	//静态数组存放栈中元素
	int top;				//栈顶指针
}SqStack;

void testStack(){
	SqStack S;	//声明一个顺序栈(分配空间)
	//...后继操作...
}
  • 顺序存储:给各个数据元素分配连续的存储空间,大小为MaxSize*sizeof(ElemType)

(二)、基本操作

(1)InitStack(&S)初始化栈。构造一个空栈 S,分配内存空间

//初始化栈
void InitStack(SqStack &S){
	S.top = -1;		//初始化栈顶指针
}

(2)DestroyStack(&S)销毁栈。销毁并释放栈 S 所占用的内存空间

  • 让top=-1,然后由于我们是声明栈时分配内存空间,而不是使用malloc函数,因此函数运行结束后相系统自动回收内存。

(3)Push(&S,x)进栈,若栈S未满,则将x加入使之成为新栈顶

//新元素入栈
bool Push(SqStack &S, ElemType x){
	if(S.top == MaxSize-1)		//栈满,报错
		return false;
	S.top = S.top + 1;			//指针先加1
	S.data[S.top] = x;			//新元素入栈
	return true;
}
  • 注意:下面图片为初始化栈时,S.top = -1时,下面图片的情况才正确
    在这里插入图片描述
  • 注意:下面图片为初始化栈时,S.top = 0 时,下面图片的情况才正确
    在这里插入图片描述

(4)Pop(&S,&x)出栈,若栈S非空,则弹出栈顶元素,并用x返回。【删除栈顶元素】

//出栈操作
bool Pop(SqStack &S, ElemType &x){//👉变量x加了引用符号,所以在出栈里面操作的变量x和函数的调用者定义的变量x对应的是同一份数据,而不是复制品。
	if(S.top == -1)		//栈空,报错
		return false;
	x = S.data[S.top];	//栈顶元素先出栈
	S.top = S.top - 1;	//指针再减1
	return true;
}
  • 数据还残留在内存中,只是逻辑上被删除了
  • 注意:下面图片为初始化栈时,S.top = -1时,下面图片的情况才正确
    在这里插入图片描述
  • 注意:下面图片为初始化栈时,S.top = 0 时,下面图片的情况才正确
    在这里插入图片描述

(5)GetTop(S, &x)读栈顶元素。若栈 S 非空,则用 x 返回栈顶元素【不删除栈顶元素】

//读取栈顶元素
bool GetTop(SqStack S, ElemType &x){
	if(S.top == -1)		//栈空,报错
		return false;
	x = S.data[S.top];	//x记录栈顶元素
		return true;
}

(6)StackEmpty(S):判断一个栈 S 是否为空。若S为空,则返回true,否则返回false。

//判断栈空
bool StackEmpty(SqStack s){
	if(S.top == -1)		//栈空
		return true;
	else				//不空
		return false;	
}

(三)、共享栈

  • 定义:两个栈共享同一片空间。
  • 栈满的条件:top0 + 1 == top1
    在这里插入图片描述
#define MaxSize 10			//定义栈中元素的最大个数
typedef struct{
	ElemType data[MaxSize];	//静态数组存放栈中元素
	int top0;				//0号栈栈顶指针
	int top1;				//1号栈栈顶指针
}ShStack;

//初始化栈
void InitStack(ShStack &S){
	S.top0 = -1;			//初始化栈顶指针
	S.top1 = MaxSize;
}

在这里插入图片描述

三、链栈

(一)定义

  • 概念:用链式存储方式实现的栈。在这里插入图片描述在这里插入图片描述
  • 链栈的定义
typedef struct Linknode{
	ElemType data;			//数据域
	struct Linknode *next;	//指针域
}*LiStack;					//栈类型定义
  • 相当于单链表的删除操作(只是只能在链表的一端进行删除或者添加操作)
    在这里插入图片描述

以上是关于在c语言中,当处理大量数据时,常有stack overflow 或者runtime error等问题,请问怎样解决啊的主要内容,如果未能解决你的问题,请参考以下文章

OVS中arp响应的流表的实现

openVswitch(OVS)源代码分析之工作流程(数据包处理)

MERN Stack - Express 和 React 在同一个端口上?

汇编语言实验5

C语言中利用setjmp和longjmp做异常处理

Python语言在数据挖掘上非常有优势,但它唯一的缺点你知道吗?