导航:首页 > 解决方法 > 构造栈出现的问题及解决方法

构造栈出现的问题及解决方法

发布时间:2022-08-17 02:35:12

① 栈编程出现问题

主要问题是不管循环中进行了多少判断,多少符合条件的,是否执行了push,但循环结束后都执行一次s.top++,初始化时top=base,而base不变,而top总是要+1,所以top永远不会等于base,if(s.top!=s.base)永远成功匹配,也就永远执行printf("括号配对\n");

实际上只有push,没有pop,只要有入栈top和base就不同,再加上s.top++最后都要执行一边,结果就可想而知了。

如何解决栈溢出

解决递归调用栈溢出的方法是通过尾递归优化,事实上尾递归和循环的效果是一样的,所以,把循环看成是一种特殊的尾递归函数也是可以的。

尾递归,在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况。



(2)构造栈出现的问题及解决方法扩展阅读

针对堆栈溢出可能造成的计算机安全问题,通常有以下这些防范措施:

1、强制按照正确的规则写代码。

2、通过操作系统使得缓冲区不可执行,从而阻止攻击者植入攻击代码。但由于攻击者并不一定要通过植入代码来实现攻击,同时linux在信号传递和GCC的在线重用都使用了可执行堆栈的属性,因此该方法依然有一定弱点。

3、利用编译器的边界检查来实现缓冲区的保护。该方法使得缓冲区溢出不可能出现,完全消除了缓冲区溢出的威胁,但代价较大,如性能速度变慢。

4、程序指针完整性检查,该方法能阻止绝大多数缓冲区溢出攻击。该方法就是说在程序使用指针之前,检查指针的内容是否发生了变化。

③ 数据结构栈的问题

getchar()返回值为int类型, e为char类型,两者不能赋值

④ C语言数据结构 栈的基本操作问题

void InitStack(SqStack **S){
//构造一个空栈S
(*S)->base=(char *)malloc(STACK_INIT_SIZE * sizeof(char));
if (!(*S)->base) exit(OVERFLOW);//
(*S)->stacksize=STACK_INIT_SIZE;//存储分配失败
(*S)->top=(*S)->base;
}//InitStack

SqStack *S;
InitStack(&S);
//错误分析:因为C对于参数都是拷贝传递。
所以要给指针赋值,只能只用指针的指针。

⑤ 我构造了个栈,就想构造后,输出构造的栈内各元素,看下我哪出问题了,谢谢!

因为你有C++ 语句 我不会 只好把一些C++语句改成了C 就是那些无关紧要的输入 输出语句便于我找错O(∩_∩)
#include <iostream.h>
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
# define OK 1
# define ERROR 0
#define OVERFLOW 0

typedef struct
{
int * base;
int *top;
int stacksize;
}SqStack;

int InitStack(SqStack &S )
{
S.base=(int *)malloc(STACK_INIT_SIZE *sizeof(int ));
if(!S.base)exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE ;
return OK;
}

int Push(SqStack &S,int e)
{
if(S.top-S.base>=S.stacksize)
{
S.base=(int *)realloc(S.base,(S.stacksize+ STACKINCREMENT)*sizeof(int ));
if(!S.base)exit(OVERFLOW);
S.top=S.base+S.stacksize;
S.stacksize +=STACKINCREMENT;
}
*S.top=e;
S.top++;
return OK;
}

int pop(SqStack &S,int n)//输出栈内数据
{
int i;
if(S.top==S.base)//判断应该用==
return ERROR;
for(i=0;i<n;i++)
{
S.top--;
printf("%d ",*S.top);
}
printf("\n");
return 0;
}

void main()
{
int i,n;
SqStack S;
int e;
InitStack(S);//你的S 先前并没有开辟空间
printf("输入插入栈的个数");
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("输入要插入栈第%d的元素",i+1);
scanf("%d",&e);
Push(S, e);
}
pop(S,n);
}

⑥ 关于数据结构中栈的问题

首先你得先实现一个栈的数据结构,主要包括函数InitStack()、Push()、Pop()、StackEmpty()。例如:

#include <stdio.h>
// 函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
// Status是函数的类型,其值是函数结果状态代码
typedef int Status;
typedef int SElemType;

// = = = = = ADT Stack的表示和实现 = = = = =

// - - - - - 栈的顺序存储表示 - - - - -

#define STACK_INIT_SIZE 100 // 存储空间初始分配量
#define STACKINCREMENT 10 // 存储空间分配增量
typedef struct{
SElemType *base; // 在栈构造之前和销毁之后,base的值为NULL
SElemType *top; // 栈顶指针
int stacksize; // 当前已分配的存储空间,以元素为单位
}SqStack;

// - - - - - 基本操作的算法描述(部分) - - - - -
Status InitStack(SqStack &S){
// 构造一个空栈S
S.base = (SElemType*)malloc(STACK_INIT_SIZE * sizeof(SElemType));
if(!S.base) exit(OVERFLOW); // 存储分配失败
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
return OK;
}// InitStack

Status Push(SqStack &S, SElemType e){
// 插入元素e为新的栈顶元素
if(S.top - S.base >= S.stacksize) { // 栈满,追加存储空间
S.base = (SElemType*)realloc(S.base,
(S.stacksize + STACKINCREMENT) * sizeof(SElemType));
if(!S.base)exit(OVERFLOW); // 存储分配失败
S.top = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;
}
* S.top++ = e;
return OK;
}// Push

Status Pop(SqStack &S, SElemType &e){
// 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
if(S.top == S.base) return ERROR;
e = *--S.top;
return OK;
}// Pop

Status StackEmpty(SqStack S){
if(S.base == S.top) return TRUE;
else return FALSE;
}

//下面是按书上的代码:
void conversion(){
// 对于输入的任意一个非负十进制整数,打印输出与其等值的八进制数
SqStack S;
int n;
SElemType e;

InitStack(S); //构造空栈
scanf("%d", &n);
while(n){
Push(S, n % 8);
n = n/8;
}
while(!StackEmpty(S)){
Pop(S,e);
printf("%d",e);
}
}// conversion
/*算法 3.1*/

//下面是改进的:
void conversion2(int n, int base){
SqStack S;
SElemType e;

InitStack(S); //构造空栈
while(n){
e = n % base;
if(e < 10)
Push(S, e + 48);
else
Push(S, e + 64-9); //96
n = n/base;
}
printf("the number based on %d is:", base);
while(!StackEmpty(S)){
Pop(S,e);
printf("%c",e);
}
}

void main()
{
int n, base;
printf("输入一个十进制数:");
conversion();
printf("\n输入一个十进制数和要转换的进制数:");
scanf("%d %d", &n, &base);
conversion2(n, base);
}

⑦ 构造顺序栈问题

构造栈时形参是个指向指针的指针后,程序执行CreatStack函数后,已经修改了main函数中的sqstack,也就不用再return s;(此时s为一级指针),你也可以用c++中的值引用&,这样也不用在返回指针。有问题,再讨论!^_^

⑧ 假设出现了内存溢出或者栈溢出的话,怎么去解决这些问题

内存溢出,一般是指堆栈溢出,通常有以下可能及解决方法: 1、程序本身有bug。这种情况,通常出在程序的调试阶段和beta测试版中。换正式版一般可以解决。 2、系统太新,程序太老。比如xp时代的程序在win10下运行,就经常会出现这种情况。

阅读全文

与构造栈出现的问题及解决方法相关的资料

热点内容
作品分析法的方法类型 浏览:681
有什么方法可以截歌曲 浏览:96
怎么学习人工智能的方法 浏览:572
肺不张怎么治疗方法 浏览:834
l型伸缩缝盖板安装方法 浏览:907
你知道关爱植物的方法有哪些吗 浏览:263
正确的丰胸方法按摩手法视频 浏览:914
199分之8的简便方法计算 浏览:667
生豆芽的方法视频 浏览:582
神经膜脱落的最佳治疗方法 浏览:43
胃肠胀气的治疗方法 浏览:957
征服异界手机版在哪里下载方法 浏览:276
解锁加密在哪里设置方法 浏览:80
座便池安装方法 浏览:265
国医大师治疗脑中风的方法 浏览:611
小米手机浏览器在哪里设置方法 浏览:108
湿疹鉴别的方法 浏览:358
乳房刮痧方法视频 浏览:143
资本成本权重的计算方法 浏览:813
薄饼档的使用方法 浏览:239