Yahoo奇摩知識+ 將於 2021 年 5 月 4 日 (美國東部時間) 終止服務。自 2021 年 4 月 20 日 (美國東部時間) 起,Yahoo奇摩知識+ 網站將會轉為唯讀模式。其他 Yahoo奇摩產品與服務或您的 Yahoo奇摩帳號都不會受影響。如需關於 Yahoo奇摩知識+ 停止服務以及下載您個人資料的資訊,請參閱說明網頁。

Iris 發問時間: 電腦與網際網路程式設計 · 1 0 年前

C語言的stack

我懂stack的概念,

可是要用指標寫,

我真的腦筋轉不過來,

課本又一堆不清不楚的變數,

所以希望高手寫出來讓我研究:

push( )

pop( )

這兩個函式的程式碼

希望可以好好解釋一下妳寫的變數

麻煩了!

2 個解答

評分
  • 1 0 年前
    最佳解答

    1.stack結構

    struct stack{

    int val;

    struct stack *next;

    }*p,*top;

    p為暫存資料使用

    top則指向最上面一筆的資料

    2.push就是把資料放入堆疊

    int push(int n){

    p = (struct stack *)malloc(sizeof(struct stack));

    p->val = n;

    p->next = top;

    top = p;

    }

    先用malloc取得一個記憶體位址來存放資料

    p->val = n; 把資料放入堆疊

    p->next = top把此筆資料的連結指向下一筆

    top = p; 更新最上面一筆的資料為p

    3.取出堆疊資料

    int pop(){

    int val;

    p = top;

    val = p->val;

    top = p->next;

    free(p);

    return val;

    }

    p = top; 指向最上一筆的資料

    val = p->val; 將資料暫存

    top = p->next; 將最上層的資料指向下一筆(因為原本的資料已拿掉了)

    free(p); 釋放記憶體

    return val; 就是回傳執啦!

    ===================底下是程式碼==========================

    #include <stdio.h>

    #include <stdlib.h>

    //*****************堆疊(串列寫法)***********//

    struct stack{

    int val;

    struct stack *next;

    }*p,*top;

    int isEmpty();

    int push(int n);

    int pop();

    int main(){

    int n;

    top = tail = NULL;

    while (scanf("%d",&n),n!=0){

    push(n);

    }

    //pop..

    p = top;

    while (!isEmpty()){

    printf("%d ",pop());

    }

    return 0;

    }

    //函數區

    int isEmpty(){

    return top==NULL;

    }

    int push(int n){

    p = (struct stack *)malloc(sizeof(struct stack));

    p->val = n;

    p->next = top;

    top = p;

    }

    int pop(){

    int val;

    p = top;

    val = p->val;

    top = p->next;

    free(p);

    return val;

    }

    參考資料: 自已最近給自已的作業(串列寫法)
  • Dave
    Lv 7
    1 0 年前

    用陣列 implement 的 stack:

    #define MIN_STACK_SZ 8 // 限制 stack 最小的大小 (至少有 8 元素大)

    typedef struct

    {

    int sp; // 記錄在陣列中下一個空的空間

    int sz; // 記錄陣列的最大長度

    int* data; // 陣列;真正儲存資料的地方

    } Stack;

    void Push( Stack& s, int val) 把數字 push 上 stack (要是空間不夠會動態增加陣列空間)

    {

    if( !s.sz ) // init stack

    {

    s.data = (int*)malloc( sizeof(int) * MIN_STACK_SZ );

    s.sz = MIN_STACK_SZ;

    }

    else if( s.sp == s.sz ) // stack full, grow

    {

    int* tmp = (int*)malloc( sizeof(int) * s.sz * 2 ); // 放大 2 倍

    memcpy( tmp, s.data, s.sp * sizeof(int) );

    free( s.data );

    s.data = tmp;

    s.sz *= 2;

    }

    s.data[s.sp++] = val;

    }

    int Pop( Stack& s ) // 把一個數字 pop 出來 (會動態縮小陣列要是有太多空間被浪費的話)

    {

    if( s.sp )

    {

    int val = s.data[--s.sp];

    if( s.sp < s.sz / 4 && s.sz > MIN_STACK_SZ ) // shrink

    {

    int* tmp = (int*)malloc( sizeof(int) * s.sz / 2 );

    memcpy( tmp, s.data, s.sp * sizeof(int) );

    free( s.data );

    s.data = tmp;

    s.sz /= 2;

    }

    return val;

    }

    return 0;

    }

    int IsEmpty( Stack s ) // 看 stack 是不是空的

    {

    return s.sp == 0;

    }

    int Peek( Stack& s ) // 只是看 stack 最上面的那一個元素,但不把它 pop 出來

    {

    if( s.sp )

    return s.data[ s.sp - 1 ];

    return 0;

    }

    void FreeStack(Stack& s) // 把陣列放掉 (要是有用到的話)

    {

    if( s.sz ) free(s.data);

    s.sz = 0;

    }

    int main()

    {

    Stack s;

    s.sz = s.sp = 0; // 要 init sz 跟 sp,Stack的 function 才會正確運作

    Push( s, 1 );

    Push( s, 2 );

    Push( s, 3 );

    Push( s, 4 );

    Push( s, 5 );

    Push( s, 6 );

    Push( s, 7 );

    Push( s, 8 );

    Push( s, 9 );

    Push( s, 10 );

    while( !IsEmpty( s ) )

    {

    printf("val: %d; stack sz: %d\n", Pop( s ), s.sz);

    }

    FreeStack( s );

    system("pause");

    }

還有問題?馬上發問,尋求解答。