⑴ 數據結構(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開始一個個的刪除,不能從中間刪除,這是棧的特性