① 棧編程出現問題
主要問題是不管循環中進行了多少判斷,多少符合條件的,是否執行了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下運行,就經常會出現這種情況。