用一段代碼表示棧的基本操作
這裏棧原理的實現需要線性表中節點的概念,所以如果對棧的理解有問題,可以先學習一下線性表的知識。這裏用到了結構體的知識,可以實現棧的初始化、棧的遍歷、push函數、pop函數、查看棧是否爲空以及棧的清空等操作。
#include<iostream>
#include<cstdio>
#include<malloc.h>
using namespace std;
//這裏的結構體是棧裏面的東西 ,分別表示數據域和下一個數據
typedef struct node
{
int member;
struct node* pNext;
}Node,*pNode;
//這是結構體的外殼 ,分別表示棧頂和棧底
typedef struct stack
{
pNode Top;
pNode Bottom;
}Stack,*pStack;
void InitStack(pStack);
bool Push(pStack,int);
void TraverseStack(pStack);
bool Empty(pStack);
int Pop(pStack);
void Clear(pStack);
//進行棧的初始化
void InitStack(pStack ps)
{
ps->Top = new Node;
ps->Bottom = ps->Top;
ps->Top->pNext = NULL;
return;
}
bool Push(pStack ps,int data)
{
pNode pNew = new Node;
if(NULL == pNew)
{
return false;
}
//把要進棧的數據賦給新節點的member成員
pNew->member = data;
//使新節點的指針指向棧頂
pNew->pNext = ps->Top;
//把新節點作爲新棧頂
ps->Top = pNew;
return true;
}
//進行棧的遍歷
void TraverseStack(pStack ps)
{
pNode pNew = ps->Top;
while(pNew != ps->Bottom)
{
cout << pNew->member;
pNew = pNew->pNext;
}
return;
}
//判斷棧是否爲空
bool Empty(pStack ps)
{
if(ps->Top == ps->Bottom)
{
return true;
}
else
{
return false;
}
}
//進行出棧操作
int Pop(pStack ps)
{
pNode pSwap = NULL;
int return_val;
//用於返回棧頂元素
return_val = ps->Top->member;
pSwap = ps->Top;
//使棧頂指向棧頂的下一個節點
ps->Top = ps->Top->pNext;
//釋放以前的棧頂空間b
//free(pSwap);
return return_val;
}
void Clear(pStack ps)
{
pNode pNew = NULL;
//棧底和棧頂不等,循環
while(ps->Top != ps->Bottom)
{
//使一個新的節點和棧頂指向同一空間
pNew = ps->Top;
//使棧頂指向棧頂的下一個節點
ps->Top = ps->Top->pNext;
//釋放掉以前的棧頂空間
free(pNew);
}
return;
}
int main(void)
{
//定義一個棧
Stack s;
int i;
int num;
//臨時保存用戶輸入的數據
int data;
//保存Pop函數的返回值
int re_num;
InitStack(&s);
cout << "你想輸入幾個數據:";
cin >> num;
for(i = 0;i < num;i++)
{
cout << "第" << i+1 << "個數字:";
cin >> data;
//調用Push函數
if(Push(&s,data))
{
continue;
}
else
{
cout << "進行棧操作失敗" << endl;
exit(-1);
}
}
//調用遍歷函數
TraverseStack(&s);
cout << "想要刪除幾個數字:";
cin >> data;
cout << "你去掉的數字是:";
for(i = 0;i < data;i++)
{
//調用Pop函數,並把返回值賦給re_num
re_num = Pop(&s);
cout << re_num;
}
cout << "刪除後的剩餘數據是:";
TraverseStack(&s);
cout << endl;
//調用清空棧函數
Clear(&s);
cout << "棧是否清空" << endl;
TraverseStack(&s);
cout << endl;
return 0;
}