當前位置:首頁 » 編程語言 » c語言判斷棧費空
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言判斷棧費空

發布時間: 2023-01-05 02:26:22

⑴ 數據結構(c語言)兩個棧共存儲在一個長度為n的一維數組中……

想法是stack1,stack2的base分別在數組的兩端。
stack1每次push的時候top + 1,stack2每次push時top-1,
初始時top1=base1,top2=base2,判斷是否用空餘空間可以用stack1.top > stack2.top
pop操作相反,判斷棧空可以用stack.base == stack.top

⑵ c語言數據結構高手請進,關於順序棧的基本操作問題。

1. 想通過調用函數改變某個變數的值,必須傳遞這個變數的地址。也就是在InitStack中申請的內存並沒有賦給Main中的s變數,會導致後面的訪問出錯。改為引用就可以了:
void InitStack(SqStack* &s)//初始化棧
{
s=(SqStack *)malloc(sizeof(SqStack));
s->top=-1;
}

2.在"Pop(s,e);", 這個e並沒有內存,導致"*e=s->data[s->top];"出錯。
需要給它申請內存:
ElemType *e = (ElemType*)malloc(sizeof(ElemType));
最後"free(e);"一下。

⑶ C語言的相關問題

呵呵,初看這些題,我想樓主應該會覺得很簡單吧,其實不然,這些題目看上去簡單,
實際上稍微有點不嚴謹就會算錯,下面我說下我的答案與分析過程
首先有幾個基本概念樓主要知道:
【一、以上都是邏輯表達式,得出的結果要麼是0,要麼是1.
二、在邏輯表達式中計算的時候,非零的數值被認為是真,為零則是假,輸出的時候,如果是假則輸出0,真則輸出1。
三、「&&」的優先順序高於「||」,也就是說如果在一句話裡面即出現了「&&」又出現了「||」,那麼則先執行「&&」,再執行「||」】
1、0【因為b不等以c所以右端為0由於是「&&」連接所以
整句為0】
2、1【因為左端a不等於0即為真,而又是用「||」連接,所以表達式結果直接為0】
3、1【最優端為1,又是用「||」連接所以表達式為1】
4、0【最右端為0所以,又是用「&&」連接,所以為0】
5、1【「&&」的兩端計算結果都不為0,所以表達式為1】
PS:【實際上如果出現a||(表達式)的情況的時候,計算機首先檢測「||」兩端有不有直接是非零的,如果此時a是非零的話,例如(1||(表達式))計算機是不會計算右邊的表達式的,因為無論右邊表達式的值是0還是1,結果都是1.只有當a=0的時候,才會計算。同理如果是a&&(表達式)的時候,如果a是0,則不計算右邊的表達式】
第二題,1、樓主抄寫時可能出錯了,建議仔細檢查下。
2、樓主掉了x的值,建議仔細檢查下。
(PS:我想樓主寫的第3題應該是第二題的參數值吧,可惜掉了x的值)

⑷ C語言幫忙看看

#include<stdio.h>
#include<stdlib.h>
#defineN10//棧的大小
typedefvoid*ELEMENT
//由於不懂你為啥在整型棧里要放入其它類型的數據,所以只能用void指針替換了
structStack
{
int*List;
intcurNumber;
};
voidiniStack(structStack*a)
{
a->curNumber=-1;
a->List=(int*)malloc(N*sizeof(int));
}
voidclearStack(structStack*a)
{
if(a->List!=null)
free(a->List);
}
voidpush(structStack*a,Elementobj)
{
if(a->curNumber<N-1)
{
a->curNumber++;
*((a->List)+a->curNumber)=*((int*)obj);
}
else
{
N=N*2;
int*tmp=(int*)malloc(N*sizeof(int));
for(inti=0;i<=a->curNumber;i++)
*(tmp+i)=*((a->List)+i);
free(a->List);
List=tmp;
a->curNumber++;
*((a->List)+a->curNumber)=*((int*)obj);
}
}
voidpop(structStack*a);
{
if(a->curNumber>-1)
a->curNumber--;
}
ELEMENTget_top(structStack*a)
{
returna->List+a->curNumber;
}
intis_empty(structStack*a)
{
if(a->curNumber>-1)return1;
elsereturn0;
}
voiddisplay(structStack*a)
{
if(a->curNumber>-1)
for(inti=curNumber;i>=0;i--)
printf("%d",*(a->List+a->curNumber));
}
intmain()
{
structStack*a;
iniStack(a);
for(inti=1;i<=4;i++)
push(a,&i);
display(a);
clearStack(a);
return0;
}

⑸ c語言棧的試題

直接拷貝上來的內容,看不出填空的下劃線在哪裡,所以只好自己猜一下了!

下面程序經過了修改,增加了輸出輔助理解,1/2/3/4/5是猜測的填空處,同學請自己對照一下吧!

#include <stdio.h>

#include<stdlib.h>

#define M 100


typedef struct //定義棧 後進先出;

{

char data[M];

int top;

}zhan;


void cshz(zhan *s) //初始化棧

{

s->top=-1; // s.top=-1

memset(s->data, 0, sizeof(s->data));

}


int pdzk(zhan *s) //判斷棧是否為空

{

// 5?

if( s->top <= -1 ) // if( s.pdzk==-1 ) // 5?

{

return 0;

}

else

{

return 1;

}

}


void ruzhan(zhan *s,char x) //入棧

{

if(s->top >= M) // if(s->top==m)

{

printf("棧滿 ");

}

else

{

// 4;

s->data[s->top] = x;

s->top += 1;

printf("入棧:%c ", x);

}

}


char chuzhan(zhan *s) //出棧

{

char y;

if(s->top <= -1) // if(s->top==0)

{

printf("棧空 ");

return '0';

}

else

{

s->top -= 1;

y = s->data[s->top]; // 5;

printf("出棧:%c ", y);

return y;

}

}


typedef struct { //定義隊列 先進先出;

char data[M]; // char data[m];

int front; // 頭,進;

int rear; // 尾,出;

}i;


void cshdl(i *q) //初始化隊列

{

// 3;

q->front = 0;

q->rear = 0;

memset(q->data, 0, sizeof(q->data));

}


void rui(i *q,char e) //入隊

{

if((q->rear+1)%M==q->front)

{

printf("隊列為空 ");

}

else

{

q->data[q->rear]=e;

q->rear=(q->rear+1);

printf("入隊:%c ", e);

}

}


char chui(i *q) //出隊

{

char f;

if( (q->rear+1)%M==q->front ) // 2;

{

printf("隊列為空 ");

return 0;

}

else

{

f=q->data[q->front];

q->front=(q->front+1);

printf("出隊:%c ", f);

return f;

}

}


int main()

{

char c;

int y=0;

zhan *s=(zhan *)malloc(sizeof(zhan));

i *q=(i *)malloc(sizeof(i));

cshz(s); //初始化棧

cshdl(q); //初始化隊列

printf("輸入一個字元串: ");

while( (c = getchar()) != ' ' ) // 1;

{

ruzhan(s,c);

rui(q,c);

}

while(pdzk(s)) //判斷棧是否為空

{

if(chuzhan(s)==chui(q))

{

y=1;

}

else

{

y=0;

break;

}

}

if(y==1)

printf("此字元串為迴文 ");

else

printf("此字元串不是迴文 ");

printf("棧: %s top:%d ", s->data, s->top);

printf("隊: %s f:%d r:%d ", q->data, q->front, q->rear);

free(s);

free(q);

return 0;

}

⑹ 編寫一個C源程序,其中包含順序表示的空棧的創建、判斷棧是否為空、進棧、出棧、取棧頂元素等操作。

樓主你好
以下是順序棧的操作實現(c語言代碼):

#include<stdio.h>
#include<malloc.h>
#define MAX 20

typedef struct node
{
int data[MAX];
int top;
}Stack;

void Initial_Stack(Stack * &s)//初始化棧
{
s=(Stack *)malloc(sizeof(Stack));
s->top=-1;
}

void Empty_Stack(Stack *s)//判斷棧是否為空
{
if(-1 == s->top)
printf("棧空!\n");
else
printf("棧非空!\n");
}

void Creat_Stack(Stack * &s)//創建棧
{
int i=0;

printf("Enter the data:\n");
do{
scanf("%d",s->data+i);
s->top=i;
i++;
}while(i<MAX&&getchar()!='\n');
}

void Disp_Stack(Stack * &s)//列印棧
{
int i;
for(i=s->top;i>=0;i--)
printf("%d: %d\n",s->top-i+1,s->data[i]);
}

void Push_Stack(Stack * &s,int e)//壓棧
{
if(s->top==MAX-1)
{
printf("Stack full!\n");
return;
}

s->top++;
s->data[s->top]=e;
printf("After push:\n");
Disp_Stack(s);
}

void Pop_Stack(Stack * &s)//出棧
{
if(s->top==-1)
{
printf("Stack empty!\n");
return;
}
s->top--;

printf("After pop:\n");
Disp_Stack(s);
}

int main()
{
Stack *S;

Initial_Stack(S);
Empty_Stack(S);
Creat_Stack(S);
Empty_Stack(S);
printf("Initial stack:\n");
Disp_Stack(S);
Push_Stack(S,0);
Pop_Stack(S);

return 0;
}

希望能幫助你哈

⑺ C語言!!!棧

#defineSTACK_SIZE100//定義棧容量為100
intcontents[STACK_SIZE];//定義數組contents用作棧
inttop=0;//定義並初始化棧頂指針為0

//函數作用:清空棧
voidmake_empty(void)
{
top=0;//直接將棧頂指針置0
}

//函數作用:判斷棧是否為空
boolis_empty(void)
{
returntop==0;//返回top是否等於0
}

//函數作用:判斷棧是否已滿
boolis_full(void)
{
returntop==STACK_SIZE;//返回top是否等於STACK_SIZE
}

//函數作用:向棧中壓入一個元素i
voidpush(inti)
{
if(is_full())//如果棧已滿
stack_overflow();//執行棧上溢操作
else//否則可以入棧
contents[top++]=i;//向棧中壓入i,然後將棧頂指針+1
}

//函數作用:彈出棧頂元素並返回
intpop(void)
{
if(is_empty())//如果棧為空
stack_underflow();//執行棧下溢操作
else//否則可以出棧
returncontents[--top];//返回棧頂元素,然後將棧頂指針-1
}

⑻ 初學小白問一下C語言棧代碼的知識(絕對不恥下問)

這是簡單的手工棧,功能簡單,STL基本都能實現。具體哪一步請指出

⑼ C語言怎樣選擇出指定地址的內存並且判斷是否為空。求代碼。。。

「空」至少有兩種理解:內容為0和數據無效。不知說的是哪一種,若是前者,可如下寫代碼——
//#include "stdafx.h"//vc++6.0加上這一行.
#include "stdio.h"
#include "time.h"//
#include "stdlib.h"
void main(void){
int n,i,*pp[4];
srand((unsigned)time(NULL));
for(i=0;i<4;i++){
pp[i]=&n+rand()%330;
if(*pp[i]) printf("Unit 0x%X is not empty!\n",pp[i]);
else printf("Unit 0x%X is empty!\n",pp[i]);
}
}
嚴格說來這代碼的產生的地址並不是隨機的,是控制在可以訪問的范圍內的。因為不控制的話,隨機產生的地址落在不可訪問區就會出錯而終止執行。

⑽ 如何判斷數據結構中棧為空的問題

你說的這個情況應該是以數組構成順序棧的情況下的 一個數組以數組底為棧底,而棧頂時鍾標志是始終操作棧頂元素的。也就是說,你要壓棧,必須先把棧頂標志加一之後才能寫入,你要彈棧需要先讀出再把棧頂標志減一。 那麼,棧為空的時候標志肯定不能是0,因為它標志著棧頂元素是數組的第一個值,這樣代表棧里是有一個元素的。所以,top是-1的時候它才是空棧,寫入的時候要先加一,指向數組第一個空間了才能寫 這個沒有規定 但是要糾正一點,top是一個整型標志,它並不是一個數組下標,只是在這里你把它用作下標了 如果它是-1的時候用作下標肯定是不行的,但是作為一個棧,這個情況是不會出現的,因為你在彈棧之前肯定會檢測棧是否為空,你不會明明知道棧是空的還進行彈棧操作吧(如果硬是要操作當然出錯了),空棧壓棧前top會自加一的,這個時候是用作了下標,但是它不是-1了,所以,你擔心的數組下標問題不會存在 至於你說建立棧的話,你如果要想使用順序棧就要這樣做,定義棧空只能是top=-1 。或者,你會增加一個棧元素計數器??這樣太不劃算了追問: 我再問一下,請問就是怎麼規定top的位置啊?書上說的是習慣上稱指示棧頂位置的成員top為棧頂指針,這句話怎麼理解?那比如有4個元素的棧,我想刪除1位置上的,那麼棧的刪除方式是從棧頂指針處刪除,那麼我只需刪除1位置上的top對嗎?那麼這個top和棧頂指針什麼關系?怎麼定義啊?我沒看到說top就是數組下標的這個說法。。。回答: c語言應用的時候一般不是以 stack[top]的形勢 而是 stack + top的形勢 此時 stack是一個指針 ,指針與整型做加法表示的是偏移量 top的值就是偏移量咯,它代表元素位置。這就是那個理解方式 指示棧頂位置的成員top就是這里的整型變數top 棧是一個先入後出的數據結構,你想刪除位置1上的,那就不得不從4開始一個個的刪除,不能從中間刪除,這是棧的特性