① 栈编程出现问题
主要问题是不管循环中进行了多少判断,多少符合条件的,是否执行了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下运行,就经常会出现这种情况。