1. 程式人生 > >C語言資料結構棧鏈式結構

C語言資料結構棧鏈式結構

棧的鏈式結構

這裡寫圖片描述

連結串列節點

typedef struct node {
    char c;                             // 資料
    struct node *next;                  // 指標
}node, *pt;

棧頂指標

typedef struct stack {
    pt top;                            // 指向棧頂
    int count;                         // 可用來記錄棧的大小
}stack;

入棧操作

這裡寫圖片描述

void in (char
c, stack * p) // c為資料, *p為棧頂指標的指標,用來改變棧頂指標的值 { pt current; current = (pt) malloc (sizeof(node)); // 新建節點 current->next = (*p).top; // 新建的節點指向上一個新建的節點 current->c = c; // 資料賦值 (*p).top = current; // 改變站頂指標,使其指向新建的節點。
(*p).count++; // 棧長度計數自增 }

出棧操作

這裡寫圖片描述

void out (char * c, stack * p)         // 將c的指標傳入,用來傳遞出棧的值。將棧頂指標的指標傳入。
{
    pt prev;                          
    prev = (*p).top;                    // 先記錄下要出棧釋放的節點。

    if ((*p).top->next == NULL)         // 如果棧為空棧則返回空格
    {
        *c = 32
; return ; // 空棧則跳出函式 } *c = (*p).top->c; // 值傳遞,將出棧的值傳出。 (*p).top = (*p).top->next; // 棧頂指向棧的上個節點 (*p).count--; // 計數器自減 free(prev) ; // 釋放出棧的節點 }

遍歷棧並輸出

這裡寫圖片描述

void print(stack p)                              
{
    pt current = (*p).top;                      // 指向棧頂的節點
    while (current != NULL)
    {
        putchar(current->c) ;      
        current = current->next;
    } 
    printf("\n");
}

具體測試

#include<stdio.h>
#include<stdlib.h>
typedef struct node {
    char c;
    struct node *next;
}node, *pt;

typedef struct stack {
    pt top;
    int count;
}stack;

void creat (stack * p);
void in (char c, stack * p);
void out (char * c, stack * p);
void print( stack p);

int main ()
{
    char c;
    stack p;
    creat(&p);
    while(scanf("%c", &c) != EOF)
    {
        getchar();
        in(c, &p);
    }
    print(p);
        while(1)
    { 
        getchar();
        out(&c, &p);
        if (c == 32) break;
        printf("出棧%c\n", c);
        print(p);
    }

}

void creat (stack * p)
{
    (*p).top = NULL;
    (*p).count = 0;
}

void in (char c, stack * p)
{
    pt current;
    current = (pt) malloc (sizeof(node));
    current->next = (*p).top;
    current->c = c;
    (*p).top = current;
    (*p).count++;
}

void out (char * c, stack * p)
{
    pt prev; 
    prev = (*p).top; 
    *c = (*p).top->c;
    if ((*p).top->next == NULL)
    {
        *c = 32;
        return ;
    }
    (*p).top = (*p).top->next;
    (*p).count--;
    free(prev) ; 
}

void print(stack  p)
{
    pt current = p.top;
    while (current != NULL)
    {
        putchar(current->c) ;
        current = current->next;
    } 
    printf("\n");
}

測試結果
這裡寫圖片描述