2010年12月22日 星期三

【C語言】Stack 堆疊實做

堆疊 .... 具有先進後出的特性,通常將資料放入推疊叫做 PUSH而將資料由堆疊中取出叫做 POP
在這邊分享一下我實做堆疊的程式


程式的實做有分三種,最簡單的是直接使用陣列製作,另一種是使用鏈結串列


而我以下的程式是以實做出 Stack (透過 struct )的方法實做堆疊的操作,如下

#define MAX_STACK_SIZE 10

typedef struct {
    int element[MAX_STACK_SIZE];
    int top;
}Stack;
//宣告 : Stack s;


以下為程式實做部份:
#include <stdio.h>
#include <stdlib.h>
#define MAX_STACK_SIZE 10
typedef struct {
    int element[MAX_STACK_SIZE];
    int top;
}Stack;
Stack create(Stack);    //initial the top for Stack 
Stack push(Stack, int);    //implements for push
Stack pop(Stack);    //implements for pop
void showStack(Stack);   //watch the stack now
bool isEmpty(Stack);   //check is empty or not for stack
bool isFull(Stack);   //check is full or not for stack
int main(void)
{
    Stack s;
    s = create(s);
    printf("******************************************\n");
    printf("****** input   1   means    push    ******\n");
    printf("****** input   2   means    pop     ******\n");
    printf("****** input   3   means show Stack ******\n");
    printf("****** input other means    exit    ******\n");
    printf("******************************************\n");
    while(true)
    {
        int input = 0;
        printf("--input[1 or 2 or other]-- : ");
        scanf("%d", &input);
        if(input == 1){   //push
            int key;
            printf("Plz input a number for push for Stack : ");
            scanf("%d", &key);
            s = push(s, key);
        }else if(input == 2){   //pop
            s = pop(s);
        }else if(input == 3){
            showStack(s);  //view for stack
        }else{
            break;
        }
    }
    showStack(s);
    system("pause");
    return 0;
}
Stack push(Stack s, int key)
{
    if(isFull(s)){
       printf("Stack is full !!\n"); 
    }else{
        s.top = s.top + 1;
        s.element[s.top] = key;
        printf("Success push %d in the Stack\n", key);
    }
    return s;
    
}
Stack pop(Stack s)
{
    if(isEmpty(s)){
       printf("Stack is empty !!\n"); 
       return s;
    }else{
        int key = 0;
        key = s.element[s.top];
        s.top = s.top - 1;
        printf("Success pop %d in the Stack\n", key);
        return s;
    }
}
bool isFull(Stack s)
{
    return (s.top == MAX_STACK_SIZE-1);
}
bool isEmpty(Stack s)
{
    return (s.top == -1);
}
Stack create(Stack s)
{
    s.top = -1;   //initial
    return s;
}
void showStack(Stack s)
{
    printf("now Stack is : ");
    for(int i=0;i<=s.top;i++){
        printf(" %d ", s.element[i]);
    }printf("\n");
}

1 則留言:

  1. 好厲害 這學期剛學到 資料結構好難..

    我有一個疑問
    if(input == 1){ //push
    int key;
    printf("Plz input a number for push for Stack : ");
    scanf("%d", &key);

    這部分
    如果我想讓他可以輸入 字元 也可以輸入數字
    該怎麼做
    我很好奇 所以把
    scanf("%d",&key);
    改成
    scanf("%s",&key);這樣竟然可以 但是我不知道為什麼

    回覆刪除