1. 程式人生 > >資料結構實驗三——順序棧

資料結構實驗三——順序棧

#include <stdio.h>
#include <stdlib.h>
#define M 10
#define N 5
int flag=0;
typedef struct SeqStack
{
    char *top;
    char *base;
    int stacksize;
}SeqStack;
void InitStack(SeqStack *S)
{
    S->base=(char *)malloc(M*sizeof(char));
    S->top=S->base;
    S->stacksize=M;
}
void CreateStack(SeqStack *S)
{
    if(flag==1)
        printf("順序棧已經建立!\n");
    else
    {
        int i,length;
        char ch;
        printf("請輸入要建立順序棧的長度:\n");
        scanf("%d",&length);
        for(i=0;i<length;i++)
        {
            printf("請輸入順序棧的元素:\n");
            scanf("%c",&ch);
            if((ch=getchar())!='\n')
            *S->top++=ch;
        }
        flag=1;
        printf("順序棧建立完成!\n");
    }
}
void PushStack(SeqStack *S)
{
    if(flag==0)
        printf("順序棧未建立,無法進行入棧操作!\n");
    else
    {
        char e;
        printf("請輸入入棧的元素!\n");
        e=getchar();
        scanf("%c",&e);
        if(S->stacksize<=S->top-S->base)
        {
            S->base=(char *)realloc(S->base,(S->stacksize+N)*sizeof(char));
            S->top=S->base+S->stacksize;
            S->stacksize+=N;
        }
        *S->top++=e;
        printf("入棧操作成功!\n");
    }
}
void PopStack(SeqStack *S)
{
    if(flag==0)
        printf("順序棧未建立,無法進行出棧操作!\n");
    else
    {
        if(S->base==S->top)
            printf("順序棧為空,無法進行出棧操作!\n");
        else
        {
            char ch;
            ch=*--S->top;
            printf("順序棧出棧成功,出棧元素為%c\n",ch);
        }
    }
}
void StackLength(SeqStack S)
{
    int len;
    if(flag==0)
        printf("順序棧未建立,無法計算棧長度!\n");
    else
    {
        len=S.top-S.base;
        printf("順序棧的長度為:%d\n",len);
    }
}
int StackEmpty(SeqStack S)
{
    if(flag==0)
        printf("順序棧未建立,無法判斷是否為空!\n");
    else
    {
        if(S.base==S.top)
        {
            printf("順序棧為空!\n");
            return 1;
        }
        else
            printf("順序棧不為空!\n");
    }
    return 0;
}
void DisplayStack(SeqStack S)
{
    if(flag==0)
        printf("順序棧未建立,無法顯示!\n");
    else
    {
        char *r,*p=--S.top;
        char *q=S.base;
        printf("順序棧的顯示順序為:\n");
        for(r=p;r>=q;r--)
            printf("%c ",*r);
        printf("\n");
    }
}
void DestoryStack(SeqStack *S)
{
    if(flag==0)
        printf("順序棧未建立,不需要銷燬!\n");
    else
    {
        free(S->base);
        flag=0;
        printf("順序棧已成功被銷燬!\n");
    }
}
void menu()
{
    printf("\t順序棧基本實驗操作\n");
    printf("*********************************\n");
    printf("1 建立順序棧!\t\t\t*\n");
    printf("2 順序棧入棧操作!\t\t*\n");
    printf("3 順序棧出棧操作!\t\t*\n");
    printf("4 求順序棧長度!\t\t*\n");
    printf("5 判斷順序棧是否為空!\t\t*\n");
    printf("6 顯示順序棧!\t\t\t*\n");
    printf("7 銷燬順序棧!\t\t\t*\n");
    printf("0 退出程式!\t\t\t*\n");
    printf("*********************************\n");
}
int main()
{
    int select;
    SeqStack ptr;
    InitStack(&ptr);
    while(1)
    {
        menu();
        printf("請輸入選擇命令:\n");
        scanf("%d",&select);
        switch(select)
        {
        case 1:
            CreateStack(&ptr);
            break;
        case 2:
            PushStack(&ptr);
            break;
        case 3:
            PopStack(&ptr);
            break;
        case 4:
            StackLength(ptr);
            break;
        case 5:
            StackEmpty(ptr);
            break;
        case 6:
            DisplayStack(ptr);
            break;
        case 7:
            DestoryStack(&ptr);
            break;
        case 0:
            exit(1);
            break;
        default :
            printf("命令輸入有誤,請重新輸入!\n");
            break;
        }
    }
    return 0;
}
這個我自己測試了一下。感覺沒什麼問題。其實也不知道到底有沒有問題!發現問題,希望大家能指出!