1. 程式人生 > >用陣列和連結串列實現棧

用陣列和連結串列實現棧

完成一個棧總共需要完成以下操作:

初始化

入棧

出棧

檢視棧頂元素

檢視棧的容量

清空棧。

首先是簡單的,用陣列做的,會有越界的可能。

#include <stdio.h>
#include <stdlib.h>


typedef struct Stack {
    int data[100];
    int top;
} Stack;

Stack * s ;
// 生成棧
void initStack(){
    s = (Stack *)malloc(sizeof(Stack));
    s->top = -1;

}

// 入棧,push
void push(int data){

    if(s->top + 1 >= 100){
        printf("超出了棧的最大容量,入棧失敗\n");
        return;
    }

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

}

// 出棧,pop
void pop(){
    if (s->top == -1){

        printf("此棧已經是空棧了\n");
        return;
    }
    printf("資料 %d  即將出棧\n",s->data[s->top]);
    s->top--;
}


// 清空棧
void clearStack(){
    while (s->top >=0){
        pop();
    }
}

// 獲取棧頂元素
void topItem(){
    if (s->top==-1){
        printf("此棧為空棧\n");
        return;
    }

    printf("此棧中元素數量為 %d 個,棧頂為 %d\n",s->top+1,s->data[s->top]);
}




int main()
{

    initStack();
    topItem();
    push(3);
    push(7);
    push(1);
    push(8);
    push(13);
    topItem();
    pop();
    clearStack();


   topItem();

}

用連結串列做的,理論上無上限,除非計算機記憶體都用完了。

#include <stdio.h>
#include <stdlib.h>


typedef struct Node {
    int data;
    struct Stack * next;
} Node;

typedef struct Stack {
    Node * data;
    int count;
} Stack;

Stack * s ;
// 生成棧
void initStack(){
    s = (Stack *)malloc(sizeof(Stack));
    s->count = 0;
    s->data = NULL;
}

// 入棧,push
void push(int data){

    Node * n = malloc(sizeof(Node));
    n->data = data;
    n->next = s->data;

    s->data = n;
    s->count ++;
}

// 出棧,pop
void pop(){

    if(s->data == NULL) {
        printf("已經是空棧了");
        return;
    }

    Node * n = s->data;
    printf("資料 %d  即將出棧\n",n->data);
    s->data=n->next;
    free(n);
    s->count--;
}


// 清空棧
void clearStack(){

    while (s->data != NULL) {
         pop();
    }

}

// 獲取棧頂元素
void topItem(){
    if (s->data==NULL){
        printf("此棧為空棧\n");
        return;
    }

    printf("此棧中元素數量為 %d 個,棧頂為 %d\n",s->count,s->data->data);
}




int main()
{

    initStack();
    topItem();
    push(3);
    push(7);
    push(1);
    push(8);
    push(13);
    topItem();
    pop();
    push(222);
    pop();
    clearStack();


   topItem();

}

計算機的函式呼叫就是採用了棧結構,還有逆波蘭表示式(可以算加減乘除和括號)的演算法都用到了棧結構。