1. 程式人生 > >c++順序棧和鏈式棧的實現

c++順序棧和鏈式棧的實現

基本定義:

棧(Stack)是n個元素a1,a2,…an,組成的有限序列,記作S =(a1,a2,…,an),並且只能在一端插入和刪除元素,n=0時稱為空棧。

棧的特徵:

由於棧只能從一端插入和刪除元素,故棧具有後進先出(Last in,first out,LIFO)的特性。稱插入和刪除的一端為棧頂(top),另一端為棧底(bottom)。稱插入元素為入棧或壓棧(push),刪除元素為出棧或彈棧(pop)。

棧的基本運算定義:

棧初始化:Init_Stack()  初始條件:棧不存在  操作結果:構造了一個空棧 判斷空: Empty_Stack()  若棧空,則返回為1,否則返回0 
入棧:   Push_Stack(S,x)    初始條件:棧S已經存在  操作結果:在棧S的頂部插入一個元素x,這樣x就、成為新的棧頂元素。 
出棧:   Pop_Stack(S,&x)   初始條件:棧S存在且不為空  操作結果:棧S的頂部元素從棧頂刪除,儲存在變數x中 
取棧頂元素: GetTop_Stack(S)  初始條件:棧s存在且不為空  操作結果:返回棧S的棧頂元素,且原棧的結構不會變化 
銷燬棧:     Destory_Stack(S) 初始條件:棧S已經存在  操作結果: 銷燬一個已經存在的棧 
棧的儲存方式:
(1)順序儲存 (2)鏈式儲存 


下面分別實現這兩種棧的儲存方式:


1、鏈式儲存


// 棧.cpp : 定義控制檯應用程式的入口點。
//實現棧的建立,增、刪、查、改


#include "stdafx.h"
#include<iostream>
#include<ctype.h>
using namespace std;


typedef struct node
{
	int data;
	struct node *next;
}Dnode;


//初始化棧
void InitStack(Dnode *&S)
{
	Dnode *top;
	top = (Dnode*)malloc(sizeof(Dnode));
	if (top == NULL)
	{
		cout << "記憶體分配失敗!" << endl;
		exit(0);
	}
	top->next = NULL;
	S = top;
}


//向棧中新增資料,輸入非數字結束
void InitData(Dnode *S)
{
	Dnode *top=S,*p;
	
	int e;
	int i = 1;
	cout << "請輸入第"<<i++<<"個數據:" ;
	cin >> e;
	cout << endl;
	while (e!=-1)
	{
		p = (Dnode*)malloc(sizeof(Dnode));
		if (p == NULL)
		{
			cout << "記憶體分配失敗!" << endl;
			exit(0);
		}
		p->data = e;
		p->next = top->next;
		top->next = p;
		cout << "請輸入第" << i++ << "個數據:";
		cin >> e;
		cout << endl;
	}
}
//壓棧
void PushToStack(Dnode *S) {
	Dnode *top=S,*p;
	int e;
	cout << "請輸入壓棧資料:";
	cin >> e;
	cout << endl;
	p = (Dnode*)malloc(sizeof(Dnode));
	if (p == NULL)
	{
		cout << "記憶體分配失敗!" << endl;
		exit(0);
	}
	else {
		p->data = e;
		p->next = top->next;
		top->next = p;
	}
}


//出棧,並釋放分配的記憶體
void PopStack(Dnode *S, int &e)
{
	Dnode *top = S->next;
	if (top!=NULL)
	{
		Dnode *delete_ptr=top;
		e=top->data;
		S->next = top->next;
		free(delete_ptr);
	}
}
//銷燬棧,釋放所有分配的記憶體
void destoryStack(Dnode *S)
{
	Dnode *delete_ptr;
	while (S->next!=NULL)
	{
		delete_ptr = S->next;
		S ->next= S->next->next;
		free(delete_ptr);
	}
	//free(S);
}


//判斷棧是否為空
bool isEmpty(Dnode *S)
{
	Dnode *top=S;
	if (top->next != NULL) {
		return false;
	}
	else {
		return true;
	}
}


//遍歷棧
void PrintStack(Dnode *S)
{
	Dnode *top = S->next;
	while (top != NULL)
	{
		cout << top->data << "  ";
		top = top->next;
	}
	cout << endl;
}

void main()
{
	Dnode *S = NULL;
	int i;
	while (true)
	{
		
		cout << endl;
		cout << "    ***********************************************************" << endl;
		cout << "    *                                                         *" << endl;
		cout << "    *     1、初始化棧                                         *" << endl;
		cout << "    *     2、向棧中新增多個值,以非數字結束                   *" << endl;
		cout << "    *     3、遍歷棧                                           *" << endl;
		cout << "    *     4、判斷棧是否為空                                   *" << endl;
		cout << "    *     5、壓棧                                             *" << endl;
		cout << "    *     6、出棧                                             *" << endl;
		cout << "    *     7、銷燬棧                                           *" << endl;
		cout << "    *                                                         *" << endl;
		cout << "    ***********************************************************" << endl;
		cout << "請輸入選單序號,執行相應操作:";




		cin >> i;
		cout << endl;
		if (S == NULL&&i != 1)
		{
			cout << "棧尚初始化,請先建立棧,再進行其他初始化操作" << endl;
			i = 1;
		}
		switch (i)
		{
		case 1://初始化棧
			InitStack(S);
			cout << "初始化完成"<<endl;
			break;
		case 2://初始化棧中資料
			InitData(S);
			PrintStack(S);
			break;
		
		case 3://遍歷棧
			PrintStack(S);
			break;
		
		case 5://壓棧
			PushToStack(S);
			PrintStack(S);
			break;
		case 6://出棧
			int e;
			PopStack(S, e);
			cout << "出棧元素為" <<e<< endl;
			cout << "出棧後的棧中資料:";
			PrintStack(S);
			break;
		case 7://銷燬棧
			destoryStack(S);
			cout << "棧已銷燬!";
			break;
		case 4://判斷棧是否為空
			bool flag = isEmpty(S);
			if (flag) { cout << "棧為空!" << endl; }
			else {
				cout << "棧不為空!" << endl;
			}
			break;
		}


	}
	system("pause");
}


2順序棧的實現

#include "stdafx.h"
#include <iostream>
#define STACK_INIT_SIZE  5
#define STACK_INCREMENT  3
using namespace std;




typedef struct stack
{
	int *top;//棧頂指標
	int *base;//棧底指標
	int size;//棧當前容量
}sqStack;


//初始化棧
void InitStack(sqStack *&S)
{
	//構造一個空棧
	S = (sqStack*)malloc(sizeof(sqStack));
	S->base = S->top = NULL;
	S->size = 0;
	S->base = (int *)malloc(sizeof(int)*STACK_INIT_SIZE);
	if (!S->base)
	{
		cout << "記憶體分配失敗!"<<endl;
		exit(OVERFLOW);
	}
	else {
		S->top = S->base;
		S->size = STACK_INIT_SIZE;
		cout << "構造空棧完成!" << endl;


	}
}


//判斷棧是否為空
bool isEmptyStack(sqStack *S)
{
	if (S->base == S->top)
	{
		return true;
	}
	else
	{
		return false;
	}
}


//遍歷棧
void PrintStack(sqStack *S) {
	if (!isEmptyStack(S)) {
		int *p,*top=S->top;
		
		p = S->top;
		cout << "遍歷結果為:";
		while (S->top != S->base)
		{
			cout << *(--p) << "  ";
			S->top = p;
		}
		S->top = top;
	}
	else
	{
		cout << "棧為空!" << endl;
	}
}


//壓棧
void pushStack(sqStack *S){
	if (S->top - S->base >= S->size)
	{
		S->base = (int *)realloc(S->base,sizeof(int)*(S->size + STACK_INCREMENT));
		if (!S->base)
		{
			exit(OVERFLOW);
		}
	}
	int *p=S->top;
	int e;
	cout << "請輸入壓棧元素:" ;
	cin >> e;
	*p++ = e;
	S->top = p;


}


//出棧
bool popStack(sqStack *S, int &e)
{
	int *p = S->top;
	if (p != S->base)
	{
		e = *--p;
		S->top = p;
		return true;
	}
	else
	{
		cout << "棧為空!"<<endl;
		return false;
	}
}


void main()
{
	sqStack *S=NULL;
	int i;
	while (true)
	{
		cout << endl;
		cout << "    ***********************************************************" << endl;
		cout << "    *                                                         *" << endl;
		cout << "    *     1、初始化棧                                         *" << endl;
		cout << "    *     2、遍歷棧                                           *" << endl;
		cout << "    *     3、判斷棧是否為空                                   *" << endl;
		cout << "    *     4、壓棧                                             *" << endl;
		cout << "    *     5、出棧                                             *" << endl;
		cout << "    *                                                         *" << endl;
		cout << "    ***********************************************************" << endl;
		cout << "請輸入選單序號,執行相應操作:";


		cin >> i;
		if (S == NULL&&i != 1)
		{
			cout << "請先初始化棧,再進行其它操作:" << endl;
			i = 1;
		}
		else
		{
			cout << endl;
		}


		


		switch (i)
		{
		case 1://初始化棧         
			InitStack(S);
				
			break;
		case 2://遍歷棧
			PrintStack(S);
			break;


		case 3://判斷棧是否為空   
			if (isEmptyStack(S))
			{
				cout << "棧為空!" << endl;
			}
			
			break;


		case 4://壓棧  
			pushStack(S);
			PrintStack(S);
			break;


		case 5://出棧
			int e;
			if (popStack(S, e))
			{
				cout << "出棧元素為:" << e << endl;
			}
			cout << "出棧後為:";
			PrintStack(S);
			cout << endl;
			break;


		default:
			cout << "請輸入正確的選單序號!"<<endl;
			break;
		}


	}
	system("pause");
}