1. 程式人生 > 實用技巧 >棧陣列與棧連結串列程式碼實現

棧陣列與棧連結串列程式碼實現

棧陣列

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define maxn 10000
 
//結點設計
typedef struct stack{
    int data[maxn];
    int top;
}stack;
 
//建立
stack *init(){
    stack *s=(stack *)malloc(sizeof(stack));
    if(s==NULL){
        printf("分配記憶體空間失敗");
        exit(0);
    }
    memset(s
->data,0,sizeof(s->data)); //memset操作來自於庫檔案string.h,其表示將整個空間進行初始化 //不理解可以查閱百度百科https://baike.baidu.com/item/memset/4747579?fr=aladdin s->top=0; //棧的top和bottom均為0(表示為空) return s; } //入棧push void push(stack *s,int data){ s->data[s->top]=data; s->top++; } //出棧pop void pop(stack *s){
if(s->top!=0){ s->data[s->top]=0; //讓其迴歸0模擬表示未初始化即可 s->top--; } } //模擬列印棧中元素 void print_stack(stack *s){ for(int n=s->top-1;n>=0;n--){ printf("%d\t",s->data[n]); } printf("\n"); //習慣性換行 } int main(){ stack *s=init(); int input[5]={11,22
,33,44,55}; //模擬五個輸入資料 for(int i=0;i<5;i++){ push(s,input[i]); } print_stack(s); ///////////// pop(s); print_stack(s); return 0; }

棧連結串列:

#include <stdio.h>
#include <stdlib.h>
//棧的結點設計
//單個結點設計,資料和下一個指標
typedef struct node     
{
    int data; 
    struct node *next;
} Node;
//利用上面的結點建立棧,分為指向頭結點的top指標和計數用的count
typedef struct stack    
{
    Node *top;
    int count;
} Link_Stack;
 
//建立棧
Link_Stack *Creat_stack()
{
    Link_Stack *p;
    //p = new Link_Stack;
    p=(Link_Stack*)malloc(sizeof(Link_Stack));
    if(p==NULL){
        printf("建立失敗,即將退出程式");
        exit(0);
    }
    p->count = 0;
    p->top = NULL;
    return p;
}
 
//入棧 push
Link_Stack *Push_stack(Link_Stack *p, int elem)
{
    if (p == NULL)
        return NULL;
    Node *temp;
    temp=(Node*)malloc(sizeof(Node));
    //temp = new Node;
    temp->data = elem;
    temp->next = p->top;
    p->top = temp;
    p->count++;
    return p;
}
 
//出棧 pop
Link_Stack *Pop_stack(Link_Stack *p)
{
    Node *temp;
    temp = p->top;
    if (p->top == NULL)
    {
        printf("錯誤:棧為空");
        return p;
    }
    else
    {
        p->top = p->top->next;
        free(temp);
        //delete temp;
        p->count--;
        return p;
    }
}
 
//遍歷棧:輸出棧中所有元素
int show_stack(Link_Stack *p)
{
    Node *temp;
    temp = p->top;
    if (p->top == NULL)
    {
        printf("");
        printf("錯誤:棧為空");
        return 0;
    }
    while (temp != NULL)
    {
        printf("%d\t", temp->data);
        temp = temp->next;
    }
    printf("\n");
    return 0;
}
 
int main()
{ //用主函式測試一下功能
    Link_Stack *p;
    p = Creat_stack();
    int n = 5;
    int input[6] = {10,20,30,40,50,60};
    /////////////以依次入棧的方式建立整個棧//////////////
    for(int i=0;i<n;i++){
        Push_stack(p, input[i]);
    }
    show_stack(p);
    ////////////////////出棧///////////////////////
    Pop_stack(p);
    show_stack(p);
    return 0;
}