當前位置:首頁 » 編程語言 » c語言棧的進

c語言棧的進

發布時間: 2022-09-24 14:15:26

1. c語言數據結構實現鏈棧的入棧、出棧、刪除與插入

1、棧(stack)又名堆棧,它是一種運算受限的線性表。
其限制是僅允許在表的一端進行插入和刪除運算。這一端被稱為棧頂,相對地,把另一端稱為棧底。向一個棧插入新元素又稱作進棧、入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素;從一個棧刪除元素又稱作出棧或退棧,它是把棧頂元素刪除掉,使其相鄰的元素成為新的棧頂元素。

2、常式:

#include<stdio.h>
#include<stdlib.h>
#defineMax100
typedefcharT;


typedefstructMyStack
{
Taa[Max];
unsignedintp;

}stack;

//創建空棧
stack*createEmptyStack()
{
stack*st=(stack*)malloc(sizeof(stack));
inti=0;
for(i=0;i<Max;i++)
st->aa[i]=0;
st->p=0;
returnst;
};

//棧判空
intisEmpty(conststack*st)
{
if(st->p==0)return1;
elsereturn0;
};

//求棧的大小
unsignedintsize(conststack*st)
{
returnst->p;
};

//push操作
voidpush(stack*st,constTa)
{
st->p=st->p+1;
if(st->p==Max)
{
printf("棧滿 ");
st->p--;
return;
}
st->aa[st->p]=a;
};

//pop操作
Tpop(stack*st)
{
if(isEmpty(st))
{
printf("棧空");
returnNULL;
}
chart=st->aa[st->p];
st->p=st->p-1;
printf("%c",t);
returnt;
};

//棧銷毀
voiddestroy(stack*st)
{
free(st);
};

intmain()
{


stack*st=createEmptyStack();
if(isEmpty(st))printf("MyStackisempty ");
elseprintf("MyStackisnotempty ");
push(st,'a');
push(st,'b');
push(st,'c');
push(st,'d');
push(st,'e');
printf("%d ",size(st));
while(!isEmpty(st))pop(st);
destroy(st);
system("pause");
return0;
}

2. c語言 用數組實現棧的進出

#include <stdio.h>
#include<string.h>
void main()
{
char behavior[10];
int stack[100];
int i,n,cnt;
scanf("%d",&n);
for(i=n-1;i>=0;i--)
{
scanf("%d",&stack[i]);
}
scanf("%d",&cnt);
while(cnt--)
{
memset(behavior,0,5);
scanf("%s",behavior);
if(!strcmp(behavior,"PUSH"))
{
for(i=n++;i>0;i--)
{
stack[i]=stack[i-1];
}
scanf("%d",&stack[0]);
continue;
}
if(!strcmp(behavior,"POP"))
{
for(i=0;i<n;i++)
{
stack[i]=stack[i+1];
}
n--;
}
}
for(i=n-1;i>=0;i--)
{
printf("%d ",stack[i]);
}
printf("\n");
}
程序輸入的時候沒有提示(可以加),不知道你習不習慣。

3. C語言 入棧順序為什麼函數入棧順序從右往左

C語言函數參數入棧順序從右到左是為了方便可變參數函數。
一、在函數調用時,函數參數的傳遞,在C語言中是通過棧數據結構實現的。
在調用函數時,先根據調用函數使用的參數,自右向左依次壓入棧中,然後調用函數,在函數開始執行時,將參數再依次彈棧。根據棧數據結構先進後出的特點,在函數中彈棧的順序就是從左向右的。
二、對於參數固定的函數,無論是從左向右還是從右向左,都沒什麼區別,最終都是所有參數全部傳遞。
三、對於可變參數,比如printf,會在第一個參數格式字元串中,指明後續有幾個參數,各自是什麼類型的。於是在函數中,參數格式字元串必須第一個彈棧,否則無法獲取參數類型,也就無法獲知後續參數占幾個位元組,導致無法正確獲知參數。
四、理論上來說,如果從左向右壓棧,可變參數標記格式字元串的參數放在最後,那麼也是可以的。 不過最早設計C語言的人採用了這種方式,後續也就延續下來了。

4. 關於進棧出棧的C語言

雙擊每一條錯誤提示,就會指示是哪一行出錯,或者是其上一行的末尾有錯誤。因為運行環境不同所以沒辦法告訴你錯在哪

5. C語言 進棧和出棧:

閑得沒事干,跟你詳細講講吧。
首先要弄明白一點,棧的結構是「先進後出「的,就像你堆積木一樣,第一根放在最底層的地面上,然後一根一根往上堆。前一個放上去的總是被後一個放上去的壓在底下。那我當我再想裡面放一根的時候,總不能放中間或者放底下吧(除非你很無聊 很寂寞 閑的蛋疼了 先一根根把堆在上面的全部拿出來 然後把要放進去的那根放上去 最後又把剛才搬下來的有重新搬上去......此處省去幾萬字)所以要往上面加東西的時候,就得放在最上面。
以上就是進棧的原理,怎麼出棧呢,很簡單,直接從」積木"的最頂端取下來就行了。
ok,以上比喻完了,希望你能看得明白。接下來講程序不說積木了:),由上面的分析 我們可以知道一個道理,對於棧的操作,棧頂的元素很重要(也就是積木最上面的那根)。為什麼呢。無論是出棧還是進棧,都跟那哥們有直接的聯系。你想啊,如果要是有元素要進棧的話,那麼它就不能當「老頂」了,那老頂之位就要交給壓在它上頭那位了;如果出棧呢,它也不能當老頂了,老頂之位就要交到原來壓在它底下的那個。
ok,所以一般的棧都將棧頂的那個元素所在的位置(內存地址--數組類型的,或者指針---節點類型的)視為棧的棧頂~!通過它來對棧進出進行操作。
一般來說(或者在我出生以來看到過的)棧有兩種內存結構(注意是是內存結構,有的書說是存儲結構,都一樣一樣滴),一種是連續的,一種是不連續的,連續的基本上就是數組了,不連續的基本上就是鏈表類型的啦。你上面的程序就是鏈表類型的,每個節點都有個指針指向它「底下」的節點(我覺得「底下」比下一個更容易理解)。通過這種你鏈我 我鏈它的方式,把一組數據連在一起。
進棧:
int Push(STACK *S,int e)//進棧
{
SNode *p; //step1:這個編程習慣不好,沒定義一個指針就應該把它指向NULL
p=(SNode *)malloc(sizeof(SNode)); //step2:為你的節點分配內存
if(!p)
return ERROR;
p->data=e; //step3:當然了,你那個傳進來的e是相當於temp,用來傳值的,ok,那就把它的 數據給p咯,p實際指向的是一塊內存塊,用來裝節點的
p->next=S->top; //step4:回到上面積木問題,進棧的時候,原來的老頂要給新來的讓位,但是如果這時候的top節點直接賦給新來的元素的話,那麼那個原來的老頂是不是從此以後都找不到它了?所以,先把新來的元素的next指針指向當前的老頂,這樣的話,以後通過next指針就可以找到它了。
S->top=p; //當然,都已經處理好以前老頂的身後事了(就是以後可以通過p的next指針找到它了)那麼「讓位」就可以進行了,這時,p便戴上了 老頂 之帽了
S->length++; //既然人數都增加了,那就到公安局登記入戶口吧
return OK; //一切over,現在這個棧stack的棧頂位置就是你剛才新加進來的p了,通過stock.top指針就可以訪問到棧頂,然後出棧也是同理的,ok,all over
}

6. c語言的簡單的進棧出棧

就用這堆函數就可以了,不懂再追問
#include
<string.h>
#define
MaxSize
100
int
mystack[MaxSize];/*
第0個單元保存現在的長度
*/
/*
初始化函數
*/
void
init_stack(int*
stack){
memset(stack,0,sizeof(stack));
}
/*
入棧函數
*/
void
push_back(int*
stack,int&
num){
if(stack[0]<MaxSize-1){
++stack[0];
stack[
stack[0]
]
=
num;
}
else{
printf("ERORR!\n");
}
}
/*
返回棧空間
*/
int
size(int*
stack){
return
stack[0];
}
/*
返回棧頂函數
*/
int
top(int*
stack){
if(stack[0]>0){
return
stack[
stack[0]
];
}
else{
printf("ERORR!\n");
return
-1;
}
}
/*
出棧函數
*/
void
pop(int*
stack){
if(stack[0]>0){
--stack[0];
}
else{
printf("ERORR!\n");
}
}

7. c語言進棧agcdegg怎麼弄

摘要 我們先是寫上這樣的一個函數,傳遞過來一張棧表和一個數據類型變數。

8. 用C語言編寫函數實現順序棧的進棧、退棧、取棧頂的演算法

#include<stdio.h>
#define stacksize 100 //假定預分配的棧空間最多為100 個元素
typedef char elementtype; //假定棧元素的數據類型為字元 ,在此處可以自行設置
typedef struct
{
elementtype data[stacksize];
int top;
}seqstack;
// 置空棧
void initstack(seqstack *s)
{
s->top=-1;
//解釋一下,s->top 指向的是當前棧頂元素的位置
//當要向棧中添加一個新元素時,要先將s->top增加1,
//此時s->top 指向的就是新元素要添加的位置了。
//所以當棧為空時,填加第一元素時,top加1 後
//s->top的值就變為0,也就是第一個元素的位置了。
}
//判棧空
int stackempty(seqstack *s)
{
if(s->top==-1)
return 1; //若相等就返回1,否則為0
else return 0;
}
//入棧
void push(seqstack *s,elementtype x)
{
if(s->top==stacksize -1 ) //進棧前判斷棧是否已經滿了
printf(" stack overflow\n");
else
{
s->top= s->top + 1;
s->data[s->top]=x;
}
}
//出棧
elementtype pop(seqstack *s)
{
if(stackempty(s)) //出棧前先判斷當前棧中是否有內容
printf("stack is empty\n");
else
{
return s->data[s->top--]; //出棧後s->top的值會自減1
}
}
//取棧頂元素(只是想知道棧頂的值,並沒有出棧)
elementtype gettop(seqstack *s)
{
if(stackempty(s))
{
printf("stack already empty.\n");
}
else return s->data[s->top];
}
int main()
{
elementtype x;
seqstack *s; //定義一個棧,用指針的方式定義的
initstack(s); //想初始化定義好的棧
//當棧為空時調用出棧操作
pop(s);

//向棧中添加一個元素a
push(s,'a');

//觀察此時的棧頂元素
x=gettop(s);
printf("%c\n",x);

//再添加一個元素b
push(s,'b');

//觀察此時的棧頂元素
x=gettop(s);
printf("%c\n",x);

//彈出棧頂的元素
x=pop(s);
printf("%c\n",x);

//觀察彈出後棧頂元素的變化情況
x=gettop(s);
printf("%c\n",x);
return 0;
}

9. c語言入棧的簡單問題,多謝指點

#include
<stdio.h>
#include
<malloc.h>
#include
<stdlib.h>
#define
STACK_INIT_SIZE
1000
#define
STACKINCREMENT
10
typedef
struct
SqStack{
int
*base;
int
*top;
int
stacksize;
}SqStack;
SqStack
InitStack(SqStack
S){
S.base
=
(int
*)malloc(STACK_INIT_SIZE
*
sizeof(int));
S.top
=
S.base;
S.stacksize
=
STACK_INIT_SIZE;
return
S;
}
//InitStack
SqStack
Push(SqStack
S,int
e){
//插入元素e,為新的棧頂元素
if(S.top
-
S.base
>=
S.stacksize){//棧滿,追加存儲空間
S.base
=
(int
*)realloc
(S.base,(S.stacksize
+
STACKINCREMENT)*sizeof(int));
S.top
=
S.base
+
S.stacksize;
S.stacksize
+=STACKINCREMENT;
}
*S.top=
e;
S.top++;
return
S;
}
int
GetTop(SqStack
S){
//若棧不為空,則用e返回棧頂元素,並返回1,否則返回0
//if(S.top
==
S.base)
return
0;
int
*e;
e
=
(S.top-1);
return
*e;
}
void
printfootmark(SqStack
S){
int
tempselm;
//tempselm=GetTop(S);
for(;S.top!=S.base;){
tempselm=GetTop(S);
printf("%d
",tempselm);
S.top--;
}
printf("\n");
}
void
main(){
int
m;
SqStack
S;
S
=
InitStack(S);
S
=
Push(S,1);
S
=
Push(S,2);
S
=
Push(S,3);
printfootmark(S);
}

改成我這個代碼就可以了,問題出現在你在列印輸出的時候,對tempselm的賦值應該是在循環裡面。不然肯定只有一個值了,接下來的列印就是對這個值輸出。

熱點內容
國產高配置有哪些 發布:2024-04-27 09:18:26 瀏覽:947
建行手機app忘記密碼如何修改 發布:2024-04-27 08:58:59 瀏覽:393
蟻群演算法的數學模型 發布:2024-04-27 08:58:39 瀏覽:994
androidactivity生命 發布:2024-04-27 07:33:48 瀏覽:84
win2008伺服器搭建網站 發布:2024-04-27 07:26:51 瀏覽:640
java的vector 發布:2024-04-27 07:05:00 瀏覽:204
舊電腦共享伺服器 發布:2024-04-27 06:32:21 瀏覽:339
java程序練習 發布:2024-04-27 06:24:00 瀏覽:438
sql30 發布:2024-04-27 06:22:10 瀏覽:55
怎樣防止sql注入 發布:2024-04-27 06:11:25 瀏覽:236