1. 程式人生 > >資料結構必須掌握 棧---壓棧和出棧

資料結構必須掌握 棧---壓棧和出棧

今天剛學到壓棧出棧,就把這個具體過程都實現了一遍,廢話不多說,程式碼如下:
#include"stdafx.h"
#include<iostream>

using namespace std;
typedef class list
{
public:
    int data;
	list*next;
}; 

typedef struct stack
{
	list*ptop;
	list*pbottom;
}STACK,*PSTACK;//PSTACK等價於struct STACK*


list*head=NULL;

void initstack(PSTACK ps)//建立一個空棧
{
	ps->ptop=new list;
	if(NULL==ps->ptop)
	{
		cout<<"動分配記憶體失敗..."<<endl;
		exit(-1);
	}
	else
	{
		ps->pbottom=ps->ptop;
		ps->ptop->next=NULL;
	}
}

void push(PSTACK ps,int val)
{
	list*p1=new list;//建立一個新節點
	p1->data=val;//資料域存資料
	p1->next=ps->ptop;//這裡p1的下一個結點一定要指向ptop,因為壓棧每次都壓到棧頂,所以下一個結點就是當前ptop
	ps->ptop=p1;//把新結點地址放到top裡面
}
void traverse(PSTACK ps)//遍歷棧,即找一個指標,首先等於top,因為top指向棧的第一個結點
{
	list*p=ps->ptop;
	while(p!=ps->pbottom)
	{
		cout<<p->data<<" ";
		p=p->next;
	}
	cout<<endl;
}
bool empty(PSTACK ps)
{
	if(ps->ptop==ps->pbottom)
		return true;
	else
		return false;
}
bool pop(PSTACK ps,int *val)
{
	if(empty(ps))
		return false;
	else
	{
		list*t;
		t=ps->ptop;
		*val=t->data;//t->data是一個值,需要用*val來接收,val是一個指標,裡面是地址
		delete t;
		t=NULL;

		return true;
	}
}
void clear(PSTACK ps)
{
	if(empty(ps))
		return;
	else
	{
		list*p,*q;
		p=ps->ptop;
		q=NULL;
		while(p!=ps->pbottom)
		{
			q=p->next;
			delete p;
			p=q;
		}
		ps->ptop=ps->pbottom;
	}
}
int main()
{
	int val;
	STACK s;//STACK等價於struct stack
	initstack(&s);//需要傳進去一個地址來修改
	cout<<"i是依次為0,1,2,3,4,5,6,7,8進棧"<<endl;
	cout<<"當前棧裡面的資料順序為:"<<endl;
	for(int i=0;i<9;i++)
		push(&s,i);
	traverse(&s);
	if(pop(&s,&val))
	{
		cout<<"出棧成功,出棧元素為:"<<val<<" ";
	}
	else
	{
		cout<<"出棧失敗...."<<endl;
	}
	
	clear(&s);
	system("pause");
	return 0;
}