一、順序棧
#include <iostream>
using namespace std;
#define MAXSIZE 100 //棧的最大容量
typedef struct {
int* base;//棧底指針
int* top;//棧頂指針
int stacksize;//棧可用的最大容量
}SqStack;
void InitStack(SqStack& S) {
//構造空棧
S.base = new int[MAXSIZE];
if (!S.base) exit(OVERFLOW);//存儲分配失敗
S.top = S.base;//top初始為base表示為空棧
S.stacksize = MAXSIZE;
}
//入棧
bool Push(SqStack& S, int e) {
//插入元素e為新的棧頂元素
if (S.top - S.base == S.stacksize) return false;//棧滿
*S.top++ = e;//元素e壓入棧頂,棧頂指針加1
return true;
}
//出棧
bool Pop(SqStack& S, int& e) {
//刪除S的棧頂元素,用e返回其值
if (S.top == S.base) return false;//top=base表示為空棧,返回NULL
e=*(--S.top);//棧頂指針減1,將棧頂元素賦值給e
return true;
}
//取棧頂元素,返回S的棧頂元素,不修改棧頂指針
int GetTop(SqStack S) {
if (S.top != S.base) return *(S.top - 1);//返回棧頂元素的值,棧頂指針不變
return NULL;
}
//判斷順序棧S是否為空棧
bool isEmpty(SqStack S) {
if (S.top!=S.base) return false;//不為空返回fasle
return true;//為空返回true
}
//批量入棧
void StackInput(SqStack& S) {
int value;
cout << "請輸入入幾次棧:";
cin >> S.stacksize;//用戶輸入入幾次棧
for (int i = 0; i < S.stacksize; i++) {
cout << "請輸入第" << i + 1 << "個值:";
cin >> value;
if (Push(S, value)) cout << "入棧成功!"<<endl;
else cout << "入棧失敗!";
}
}
//依次彈出棧頂元素
void StackOut(SqStack& S) {
int value;
cout << "依次彈出的棧頂元素為:\n";
while (Pop(S,value))
{
cout << value << "\t";
}
}
int main()
{
int opearateNum = 0;//操作值
SqStack S;
InitStack(S);//初始化堆棧
while (true)
{
cout << "1、批量入棧\t2、全部出棧\t3、讀棧頂元素\t4、彈出棧頂元素\t5、退出" << endl;
cin >> opearateNum;
if (opearateNum == 5)
break;
switch (opearateNum)
{
case 1:
//入棧
StackInput(S);
system("pause");
system("cls");
break;
case 2:
//依次出棧
StackOut(S);
system("pause");
system("cls");
break;
case 3:
//讀棧頂元素
if (!isEmpty(S))cout << GetTop(S) << endl;
else cout << "堆棧無元素!" << endl;
system("pause");
system("cls");
break;
case 4:
//彈出棧頂元素
int value;//彈出的值
if (!Pop(S, value)) cout << "堆棧無元素" << endl;
else cout << "彈出的棧頂元素的值為:" << value << endl;
system("pause");
system("cls");
break;
default:
cout << "無效操作,請重新輸入!" << endl;
break;
}
}
}
二、鏈棧
#include <iostream>
using namespace std;
//鏈棧的存儲結構
typedef struct StackNode {
int elem;//棧中的數據元素
struct StackNode* next;
}*LinkStack;
//鏈棧的初始化
void InitStack(LinkStack& S) {
S = NULL;//構造一個空棧S
}
//入棧,在棧頂插入元素e
bool Push(LinkStack &S,int e) {
StackNode *p = new StackNode;//生成新結點
p->elem = e;//將新結點p的數據域設置為e
p->next = S;//將新結點插入棧頂
S = p;//修改棧頂指針為p
return true;
}
//出棧,刪除S的棧頂元素,用第二個參數返回其值
bool Pop(LinkStack& S, int& e) {
if (S == NULL) return false;//棧空 返回false
e = S->elem;//將棧頂元素值賦給e
StackNode* p = S;//用p臨時保存棧頂元素空間,以備釋放
S = S->next;//修改棧頂指針
delete p;//釋放原來的棧頂內存空間
return true;
}
//取棧頂元素,不修改棧頂指針
int GetTop(LinkStack S) {
if (S != NULL) return S->elem;//如果棧為非空則返回棧頂元素
}
//判斷鏈棧S是否為空棧
bool isEmpty(LinkStack S) {
if (S != NULL) return false;//不為空返回fasle
return true;//為空返回true
}
//批量入棧
void StackInput(LinkStack& S) {
int value;
int PushNum;//入棧數
cout << "請輸入入幾次棧:";
cin >> PushNum;//用戶輸入入幾次棧
for (int i = 0; i < PushNum; i++) {
cout << "請輸入第" << i + 1 << "個值:";
cin >> value;
if (Push(S, value)) cout << "入棧成功!" << endl;
else cout << "入棧失敗!";
}
}
//依次彈出棧頂元素
void StackOut(LinkStack& S) {
int value;
cout << "依次彈出的棧頂元素為:\n";
while (Pop(S, value))
{
cout << value << "\t";
}
}
int main()
{
int opearateNum = 0;//操作值
LinkStack S;
InitStack(S);//初始化堆棧
while (true)
{
cout << "1、批量入棧\t2、全部出棧\t3、讀棧頂元素\t4、彈出棧頂元素\t5、退出" << endl;
cin >> opearateNum;
if (opearateNum == 5)
break;
switch (opearateNum)
{
case 1:
//入棧
StackInput(S);
system("pause");
system("cls");
break;
case 2:
//依次出棧
StackOut(S);
system("pause");
system("cls");
break;
case 3:
//讀棧頂元素
if (!isEmpty(S)) cout << GetTop(S) << endl;
else cout << "堆棧為空棧!" << endl;
system("pause");
system("cls");
break;
case 4:
//彈出棧頂元素
int value;//彈出的值
if (!Pop(S, value)) cout << "堆棧為空棧!" << endl;
else cout << "彈出的棧頂元素的值為:" << value << endl;
system("pause");
system("cls");
break;
default:
cout << "無效操作,請重新輸入!" << endl;
break;
}
}
}
