C++ 棧的基本操作


  1 // zhan.cpp : 定義控制台應用程序的入口點。
  2 //
  3 
  4 #include "stdafx.h"
  5 #include <iostream>
  6 using namespace std;
  7 typedef struct stacknode
  8 {
  9     int data;
 10     struct stacknode *next;
 11 }stacknode,*LinkStack;
 12 
 13 //判斷棧為空
 14 int StackEmpty(LinkStack &top)
 15 {
 16     if(top ->next == NULL)
 17         return 1;
 18     else 
 19         return 0;
 20 }
 21 
 22 //入棧函數
 23 LinkStack push(LinkStack &top,int value)
 24 {
 25     LinkStack p = new stacknode;
 26     if(p != NULL)
 27     {
 28         p ->data = value;//可以理解為在鏈表尾部插入一個節點。
 29         p ->next = top ->next;
 30         top ->next = p;
 31     }
 32     else 
 33         cout << "沒有內存可分配" << endl;
 34     return top;
 35 }
 36 
 37 //出棧函數
 38 int pop(LinkStack &top)
 39 {
 40     LinkStack temp = new stacknode;
 41     int data;
 42     if(StackEmpty(top))
 43         cout << "該棧為空!" << endl;
 44     else 
 45     {
 46         temp = top ->next;//可以理解為刪除一個節點
 47         data = temp ->data;
 48         top ->next = temp ->next;
 49         delete(temp);
 50     }
 51     return data;
 52 }
 53 
 54 //打印函數
 55 void Print(LinkStack &top)
 56 {
 57     LinkStack top1 = top;   //時刻要注意,我們不可以改變鏈表本身的值及指向,不過我們可以找別人來完成此事。
 58     if(top1 ->next == NULL)
 59         cout << "該棧為空!"<< endl;
 60     else
 61     {
 62         while(top1 ->next != NULL)
 63         {
 64             cout << top1->next ->data<< " ";//top本身data為0,此為不帶頭節點的鏈表
 65             top1 = top1 ->next;
 66         }
 67     }
 68 }
 69 
 70 //取棧頂元素
 71 int StackTop(LinkStack &top)
 72 {
 73     LinkStack p = top;
 74     if(StackEmpty(p))
 75         cout << "該棧為空!" << endl;
 76     else 
 77     {
 78         return p ->next ->data;
 79     }
 80     
 81 }
 82 
 83 //獲得棧的長度
 84 int StackLength(LinkStack &top)
 85 {
 86     int length = 0;
 87     LinkStack q = top;
 88     while(q ->next != NULL)
 89     {
 90         length ++;
 91         q = q ->next;
 92     }
 93     return length;
 94 }
 95 
 96 //銷毀棧
 97 void DestroyStack(LinkStack &top)
 98 {
 99     LinkStack p;
100     while(top)
101     {
102         p = top ->next;//保存top的下一個位置。
103         delete top;
104         top = p;
105     }
106     cout << "銷毀成功!" << endl;
107 }
108 
109 //棧的初始化
110 void InitStack(LinkStack &top)
111 {
112     top = new stacknode;
113     top ->next = NULL;
114 }
115 
116 //前導函數
117 void printscreen(void)
118 {
119     cout<<"0------退出程序"<<endl
120         <<"1------入棧操作"<<endl
121         <<"2------出棧操作"<<endl
122         <<"3------取棧頂元素"<<endl
123         <<"4------判斷棧是否為空"<<endl
124         <<"5------返回棧的元素個數"<<endl
125         <<"6------初始化棧"<<endl
126         <<"7------顯示棧"<<endl
127         <<"8------銷毀棧"<<endl
128         <<"9------退出程序"<<endl;
129 }
130 
131 
132 int main()
133 {
134     LinkStack top = NULL;   
135     InitStack(top);   
136     printscreen();
137     int n,value;
138     cin >> n;
139     while(n) //輸入0也可以退出循環 
140     {
141         switch(n)
142         {
143            case 1 :  //入棧操作
144                cout << "請輸入一個整數" <<endl;
145                cin >> value;
146                while(value!=0) //以0作為結束條件
147                {
148                    push(top,value);
149                    cin >> value;
150                }
151                Print(top); //打印棧
152                cout << endl;
153                break;
154            case 2:   //出棧操作
155                if(top ->next != NULL)
156                    cout << "彈出的元素是:"<< pop(top) << endl;
157                break;
158            case 3:   //取棧頂元素
159                cout << StackTop(top) << endl;
160                break;
161            case 4:  //判斷棧是否為空
162                if(StackEmpty(top))
163                     cout << "該棧為空!" << endl;
164                else
165                     cout << "該棧不為空!" << endl;
166                break;
167            case 5: //返回棧的元素個數
168              if(StackEmpty(top) == 0) 
169                   cout << StackLength(top)<<endl;
170              break;
171            case 6: //初始化棧
172                InitStack(top);
173                cout << endl;
174                break;
175            case 7://顯示棧
176                Print(top); //打印棧
177                cout << endl;
178                break;
179            case 8: //銷毀棧
180                DestroyStack(top);
181                cout << endl;
182                break;
183            case 9:
184                goto end;
185            default:
186                cout << "不合法的輸入,請重新輸入"<< endl;
187         }
188     printscreen();
189     cin >> n;
190     }
191     end: ; 
192     return 0;
193 }

 

實驗二

實驗名稱:棧的基本操作

實驗目的:掌握棧的結構特點並熟悉棧的基本操作。

實驗要求:編程實現順序棧的各種基本運算,並在此基礎上設計一個主程序完成如下功能:

1、 采用鏈式存儲實現棧的初始化、判空、入棧、出棧操作。

實驗步驟及內容

 

1、首先建立一個定義多項式的結構體stacknode,及結構體指針LinkStack,該結構體包含一個數據域data,一個指向下一項的指針*next,代碼如下:

    typedef struct stacknode

{

    int data;

    struct stacknode *next;

}stacknode,*LinkStack;

2、棧的初始化,代碼如下:

//棧的初始化

void InitStack(LinkStack &top)

{

    top = new stacknode;

    top ->next = NULL;

}

3、入棧,首先開辟內存空間,並將新開辟的結點插入在此棧的后面。具體的代碼如下:

//入棧函數

LinkStack push(LinkStack &top,int value)

{

    LinkStack p = new stacknode;

    if(p != NULL)

    {

        p ->data = value;//可以理解為在鏈表尾部插入一個節點。

        p ->next = top ->next;

        top ->next = p;

    }

    else

        cout << "沒有內存可分配" << endl;

    return top;

}

 

5、出棧,從棧中刪除一個結點。首先我們必須開辟一個結點用來存儲top結點的下一個結點,然后將top->next 執行下下一個結點,這樣就刪除了一個結點。

   int pop(LinkStack &top)

{

    LinkStack temp = new stacknode;

    int data;

    if(StackEmpty(top))

        cout << "該棧為空!" << endl;

    else

    {

        temp = top ->next;//可以理解為刪除一個節點

        data = temp ->data;

        top ->next = temp ->next;

        delete(temp);

    }

    return data;

}

6、打印棧,此函數用來對棧進行輸出驗證。

   //打印函數

void Print(LinkStack &top)

{

    LinkStack top1 = top;   //時刻要注意,我們不可以改變鏈表本身的值及指向,不過我們可以找別人來完成此事。

    if(top1 ->next == NULL)

        cout << "該棧為空!"<< endl;

    else

    {

        while(top1 ->next != NULL)

        {

            cout << top1->next ->data<< " ";//top本身data為,此為不帶頭節點的鏈表

            top1 = top1 ->next;

        }

    }

}

7、去棧頂元素,如果不為空則取出棧頂元素。

//取棧頂元素

int StackTop(LinkStack &top)

{

    LinkStack p = top;

    if(StackEmpty(p))

        cout << "該棧為空!" << endl;

    else

    {

        return p ->next ->data;

    }

   

}

 

8、獲取棧的長度,必須臨時開辟一個新的結構體指針,作為top的副本,這樣就不會破壞top本身的結構了,而且對於top的副本,我們也不能對其空間進行釋放,不然top的最后一個next不會為NULL,而是一個不確定的值,這樣對以后的操作造成破壞。

//獲得棧的長度

int StackLength(LinkStack &top)

{

    int length = 0;

    LinkStack q = top;

    while(q ->next != NULL)

    {

        length ++;

        q = q ->next;

    }

    return length;

}

9、銷毀棧,就是從棧頂開始一個節點一個節點的釋放。

//銷毀棧

void DestroyStack(LinkStack &top)

{

    LinkStack p;

    while(top)

    {

        p = top ->next;//保存top的下一個位置。

        delete top;

        top = p;

    }

    cout << "銷毀成功!" << endl;

}

 

 

 

鏈表可以往后插,也可以往前插。

如果我們用 每次往后用p - > next = NULL;叫做 往后插。

 


免責聲明!

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



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