實驗三 順序棧


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

using namespace std;

#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef int SElemType;

//00定義數據元素,數據結構,其中元素為原子類型不用結構體,數據結構包含三個域需要用結構體
#define STACK_INIT_SIZE 100 // 存儲空間初始分配量   看清實驗題干要求,不是maxsize
typedef struct {
        SElemType *base; // base的初值為NULL
        SElemType *top; // 棧頂指針
        int stacksize; // 當前已分配的存儲空間,以元素為單位
} SqStack;

//01 初始化一個順序棧S
Status InitSStack(SqStack &S)
{
        S.base=new SElemType[STACK_INIT_SIZE];
        if(!S.base)
                exit(OVERFLOW);
        S.top=S.base;//不能互換,前面已經給base賦過值了,這是給top賦值。互換了,不僅base錯了,top也沒有值。
        S.stacksize=STACK_INIT_SIZE;
        return OK;
}

//02 隨機創建一個正整數值的棧(當輸入-1時創建結束 )
Status CreateSStack(SqStack &S)
{
        if(!S.base)

        InitSStack(S);

        int i=0;
        int n;
        while(i<S.stacksize)
        {
                cin>>n;
                if(n!=-1)
                {
                        *S.top=n;
                        S.top++;
                }
                else
                        break;//跳出while循環用break,程序接着執行while后面的代碼;跳出程序用return;

        }
        return OK;

}

//03 入棧
Status Push(SqStack &S,SElemType e)//S是一個結構體變量,不是指針,函數要修改實參棧的值,故而&S,即形參變了要讓實參的值也一塊變, 而e的值不需返回故不加&
{
        if(S.top-S.base==S.stacksize)
                return ERROR;
        *S.top++=e;//入棧是對棧S的操作,top指針要變,S也跟着變,故形參要&S;
        return OK;
}

//04 將棧頂元素彈出, 並在彈出結束后輸出彈出元素的值;
Status Pop(SqStack &S,SElemType &e)//S同上,同時,e的值要傳遞給實參,讓實參的值變成e,因此也要&e。
{
        if(S.top==S.base)
        {
                printf("空棧\n");
                return ERROR;
        }
        e=*(--S.top);//棧頂指針要變,先--,后把棧頂元素值返回,代碼執行完,棧整體就少了一個元素
        return OK;
}

//05 輸出棧頂元素的值
Status GetTop(SqStack S,SElemType &e)//e的值要傳回給實參,因此要&e,但S的值不需傳回實參,也就是函數功能上沒要求改變主函數中的實參,故不用加&。
{
        if(S.top==S.base)
        {
                printf("空棧\n");
                return ERROR;
        }
        e=*(S.top-1); //返回棧頂元素,但棧頂指針不能變,所以不能S.top--。

        return OK;
}
//06求棧的長度;

Status GetLength(SqStack S,SElemType &len)//e的值要傳遞給實參,因此要&e,但S的值沒變不用加&。
{
       if(S.top==S.base)
       {
              printf("空棧\n");
              return ERROR;
       }
       len=S.top-S.base;
       return OK;
}

//07 輸出從棧底到棧頂的所有元素,不能改變棧,如TOP指針等。
Status DisplaySStack(SqStack S)
{
        if(S.top==S.base)
        {
                printf("空棧\n");
                return ERROR;
        }
        int *p=S.base;
        while(p<S.top)
        {
                cout<<*(p++)<<" "; //==printf("%d",*(p++));
        }

        /*輸出從棧頂到棧底的所有元素
                int *p=S.top;
                while(p>S.base)
                {
                        p--;
                        cout<<*(p)<<" ";
                }
        */
        return OK;
}

void main()
{
        SqStack S;

        int i=InitSStack(S);//01棧的初始化
        printf("棧初始化狀態:%d\n棧的長度是:%d\n",i,S.stacksize);//測試棧是否初始化成功

        CreateSStack(S);//02棧的創建 
        printf("棧底到棧頂的元素是:");
        DisplaySStack(S); 

printf("\n入棧一個數,請輸入:");
int x;
cin>>x;
Push(S,x);//03入棧
DisplaySStack(S);

int y;
printf("\n彈出棧頂元素是:");
Pop(S,y);//04出棧
cout<<y<<endl;
DisplaySStack(S);

int z;
printf("\n讀取棧頂元素:");
GetTop(S,z);//05讀棧頂元素
cout<<z<<endl;
DisplaySStack(S);

int len;
printf("\n棧的長度是:");
GetLength(S,len);//06讀棧長
cout<<len<<endl;

cout<<"當前棧是:";

DisplaySStack(S);//07打印當前棧

        system("pause");//用於函數輸出屏幕暫停,以便觀察
}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM