用一段代碼表示棧的基本操作

用一段代碼表示棧的基本操作

這裏棧原理的實現需要線性表中節點的概念,所以如果對棧的理解有問題,可以先學習一下線性表的知識。這裏用到了結構體的知識,可以實現棧的初始化、棧的遍歷、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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章