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;叫做 往后插。