1. 程式人生 > >資料結構-順序棧的基本操作的實現(含全部程式碼)

資料結構-順序棧的基本操作的實現(含全部程式碼)

主要操作函式如下:

  •     InitStack(SqStack &s) 引數:順序棧s 功能:初始化  時間複雜度O(1)
  •     Push(SqStack &s,SElemType e) 引數:順序棧s,元素e 功能:將e入棧 時間複雜度:O(1)
  •     Pop(SqStack &s,SElemType &e) 引數:順序棧s,元素e 功能:出棧,e接收出棧元素值 時間複雜度O(1)
  •     GetTop(SqStack s,SElemType &e) 引數:順序棧s,元素e 功能:得到棧頂元素 時間複雜度O(1)
  •     注意:嚴蔚敏版沒有判斷棧空函式,在入棧、出棧函式裡面判斷棧是否空,與王道的不同 尤其是top指標在base之上(有元素時)
    另外,嚴蔚敏版 59頁取棧頂有誤
    /*
        Project: sequence_stack (資料結構-順序棧)
        Date:    2018/09/14
        Author:  Frank Yu
    	InitStack(SqStack &s) 引數:順序棧s 功能:初始化  時間複雜度O(1)
    	Push(SqStack &s,SElemType e) 引數:順序棧s,元素e 功能:將e入棧 時間複雜度:O(1)
    	Pop(SqStack &s,SElemType &e) 引數:順序棧s,元素e 功能:出棧,e接收出棧元素值 時間複雜度O(1)
    	GetTop(SqStack s,SElemType &e) 引數:順序棧s,元素e 功能:得到棧頂元素 時間複雜度O(1)
    	注意:嚴蔚敏版沒有判斷棧空函式,在入棧、出棧函式裡面判斷棧是否空,與王道的不同 尤其是top指標在base之上(有元素時)
    	      另外,嚴蔚敏版 59頁取棧頂有誤
    	
    */
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<cmath>
    #include<iostream>
    using namespace std;
    #define Status int
    #define SElemType int
    #define MaxSize 100
    //棧資料結構
    typedef struct Stack
    {
    	SElemType *base;//棧底指標 不變
    	SElemType *top;//棧頂指標 一直在棧頂元素上一個位置
    	int stacksize;//棧可用的最大容量
    }SqStack;
    //**************************************基本操作函式************************************//
    //初始化函式
    Status InitStack(SqStack &s)
    {
    	s.base=new SElemType[MaxSize];//動態分配最大容量
    	if(!s.base)
    	{
    		printf("分配失敗\n");
    		return 0;
    	}
    	s.top=s.base;//棧頂指標與棧底相同 王道上top起初在base下面,感覺很彆扭,top應該高於或等於base
    	s.stacksize=MaxSize;
    	return 1;
    }
    //入棧
    Status Push(SqStack &s,SElemType e)
    {
    	if(s.top-s.base==s.stacksize) return 0;//棧滿
    	*(s.top++)=e;//先入棧,棧頂指標再上移 注意與王道上的不同,具體問題具體分析
    	return 1;	
    }
    //出棧 用e返回值,注意e是應用型別
    Status Pop(SqStack &s,SElemType &e)
    {
    	if(s.top==s.base) return 0;//棧空
    	e=*--s.top;//先減減 指向棧頂元素,再給e
    	return 1;	
    }
    //得到棧頂元素,不修改指標
    bool GetTop(SqStack s,SElemType &e) //嚴蔚敏版59頁有問題,應該用e去獲得,函式返回bool型別去判斷
    {
    	if(s.top==s.base) return false;//棧空			
    	else e=*--s.top;
    	return true;
    		
    }
    //********************************功能實現函式**************************************//
    //選單
    void menu()
    {
       printf("********1.入棧      2.出棧*********\n");
       printf("********3.取棧頂    4.退出*********\n");
    }
    //入棧功能函式 呼叫Push函式
    void PushToStack(SqStack &s)
    {
    	int n;SElemType e;int flag;
    	printf("請輸入入棧元素個數(>=1):\n");
    	scanf("%d",&n);
    	for(int i=0;i<n;i++)
    	{
    	 printf("請輸入第%d個元素的值:",i+1);
    	 scanf("%d",&e);
    	 flag=Push(s,e);
    	 if(flag)printf("%d已入棧\n",e);
    	 else {printf("棧已滿!!!\n");break;}
    	}
    }
    //出棧功能函式 呼叫Pop函式
    void PopFromStack(SqStack &s)
    {
    	int n;SElemType e;int flag;
    	printf("請輸入出棧元素個數(>=1):\n");
    	scanf("%d",&n);
    	for(int i=0;i<n;i++)
    	{
    	 flag=Pop(s,e);
    	 if(flag)printf("%d已出棧\n",e);
    	 else {printf("棧已空!!!\n");break;}
    	}
    }
    //取棧頂功能函式 呼叫GetTop
    void GetTopOfStack(SqStack &s)
    {
    	SElemType e;bool flag; 
    	flag=GetTop(s,e);
    	if(flag)printf("棧頂元素為:%d\n",e);
    	else printf("棧已空!!!\n");
    }
    //主函式
    int main()
    {
     SqStack s;int choice;
     InitStack(s);
     while(1)
     {
      menu();
      printf("請輸入選單序號:\n");
      scanf("%d",&choice);
      if(choice==4) break;
      switch(choice)
      {
      case 1:PushToStack(s);break;
      case 2:PopFromStack(s);break;
      case 3:GetTopOfStack(s);break;
      default:printf("輸入錯誤!!!\n");
      }
     }
     return 0;
    }
    
    基本操作結果截圖

    有問題請下方評論,轉載請註明出處,並附有原文連結,謝謝!如有侵權,請及時聯絡。