1. 程式人生 > >順序棧的九種基本操作

順序棧的九種基本操作

#include<iostream>
#include<string.h>
#include<stdlib.h>
#include<math.h>
using namespace std;


#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 100

typedef int SElemType;
typedef int Status;
typedef struct
{
    SElemType *base;
    SElemType  *top;
    int  stacksize;
}SqStack;

//順序棧的初始化
Status InitStack(SqStack &S)
{// 構造一個空棧 S 
	S.base = new SElemType[MAXSIZE];	//為順序棧分配一個最大容量為MAXSIZE的陣列空間
	if(!S.base)
		exit (OVERFLOW);    	//儲存分配失敗
	S.top = S.base;
	S.stacksize = MAXSIZE;
	return OK;
}

// 順序棧的入棧
Status Push(SqStack &S,SElemType &e)
{ // 插入元素e為新的棧頂元素
	if(S.top-S.base==S.stacksize)
		return ERROR;	//棧滿
	*(S.top++) = e;	//元素e壓入棧頂,棧頂指標加1
	return OK;
}

// 順序棧的出棧
Status Pop(SqStack &S,SElemType &e)
{// 若棧不空,則刪除S的棧頂元素,用e返回其值,並返回OK;否則返回ERROR
	if(S.base == S.top)
		return ERROR;//棧空
	e = *(--S.top); //棧頂指標減1,將棧頂元素賦給e
	return OK;
}

// 取順序棧的棧頂元素
Status GetTop(SqStack S,SElemType &e)
{// 若棧不空,則用e返回S的棧頂元素,並返回OK;否則返回ERROR
	if(S.top == S.base)
		return ERROR;
	e = *(S.top-1);//棧頂指標減1,將棧頂元素賦給e
	return OK;
}

//遍歷棧
Status StackTraverse(SqStack S)
{
    SElemType *p;
	if (!S.base)
       exit(OVERFLOW);
    if (S.top == S.base)
        cout << "棧中沒有元素" << endl;
    p = S.top;
    while (p > S.base)
    {
        p--;
        cout << *p << " ";
    }

    return OK;
}

//銷燬棧
Status DestroyStack(SqStack &S)
{
    S.top = NULL; 
    S.stacksize = 0; 
    delete(S.base);
    return OK;
}

//清空棧
Status ClearStack(SqStack &S)
{
    S.top = S.base;
    return OK;
}

//判斷棧是否為空棧
Status StackEmpty(SqStack S)
{
    if (S.top == S.base)
        return ERROR;
    else
        return OK;
}

//求棧的長度
Status StackLength(SqStack S)
{
    if (S.top == S.base)
        return ERROR;
    else
        return (S.top - S.base);
}

int main(){
	int l,j;
    SqStack s;
	SElemType e;
	SElemType t;
	int c=-1;
	

	cout<<"1.建立一個空棧\n";
	cout<<"2.執行入棧操作\n";
	cout<<"3.棧的長度\n";
	cout<<"4.遍歷棧\n";
	cout<<"5.元素的出棧\n";
	cout<<"6.判斷是否為空棧\n";
	cout<<"7.清空棧\n";
	cout<<"8.銷燬棧\n";
	cout<<"0.退出!\n";

	while(c!=0){
	cout<<"請選擇:";
		cin>>c;
	switch(c){
		case 1:
			if(InitStack(s)==OK)
				cout<<"成功建立棧"<<endl;
			else
				cout<<"棧建立失敗"<<endl;
			break;

		case 2:
			int n;
			cout<<"請輸入棧中元素的個數:";
			cin>>n;
			cout<<"進棧元素依次為:"<<endl;
			if(InitStack(s)==OK)
				{
					for(j=1;j<=n;j++)
					{
						Push(s,j);
						cout<<j<<" ";
					}
			}
			cout<<endl;
			break;

		case 3:
			l=StackLength(s);
			cout<<"棧的長度為:"<<l;
			cout<<endl;
			break;

		case 4:
			StackTraverse(s);
			cout<<endl;
			break;

		case 5:
			cout<<"依次彈出的棧頂元素為:";
			while(GetTop(s,e)==OK){
				cout<<e<<" ";
				Pop(s,t);

			}
			cout<<endl;
			break;

		case 6:
			cout<<"本棧是否為空棧:";
			if(StackEmpty(s)==ERROR)
				cout<<"是"<<endl;
			else
				cout<<"否"<<endl;
			break;
		
		case 7:
			ClearStack(s);
			cout<<"棧中元素為:";
			StackTraverse(s);

			break;

		case 8:
			if(DestroyStack(s)==OK)
				cout<<"銷燬棧成功!";
			else
				cout<<"銷燬失敗";
			break;
		
		}
	}
	return 0;
}