1. 程式人生 > >【資料結構實驗二】順序棧的建立、入棧和出棧

【資料結構實驗二】順序棧的建立、入棧和出棧

版權申明:

實驗二 順序棧的建立、入棧和出棧

實驗目的

掌握棧的建立、入棧和出棧操作;理解順序棧在入棧和出棧時對Top指標的移動。

實驗內容

1. 通過結構體宣告線性棧;

2. 在初始化操作中,對棧分配儲存空間,如可容納100個元素;

3. 編寫入棧、出棧、棧空判斷(可選)操作;

4. 編寫函式,利用棧將10進位制的數轉換為8進位制的數;

5. 在主函式中對棧進行測試:

宣告一個新棧,初始化後。

(1)輸入2,4,6,… …,98,100等50個元素,然後退棧輸出所有元素。

(2)將10進位制數5678轉化為8進位制數並輸出。

原始碼:

#include "stdafx.h"
#include <iostream>

using namespace std;

#define STACK_INIT_SIZE 100
#define STACKINCREMENT  10

typedef int SElemType;
typedef int Status;

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

Status InitStack(SqStack &S){
	S.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
	if(!S.base) exit(OVERFLOW);
	S.top = S.base;
	S.stacksize = STACK_INIT_SIZE;
	return OK;
}

Status StackEmpty(SqStack S){
    if(S.top == S.base)
    return OK;
}

Status Push(SqStack &S, SElemType e){
	if(S.top - S.base >= S.stacksize){
		S.base = (SElemType *)realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(SElemType));
		if(!S.base) exit(OVERFLOW);
		S.top = S.base + S.stacksize;
		S.stacksize += STACKINCREMENT;
	}
	*S.top++ = e;
	// *S.top = e;
	// S.top++;
	return OK;
}
Status Pop(SqStack &S, SElemType &e){
	if(S.top == S.base) return ERROR;
	e = * --S.top;
	return OK;
}

void conversion(){
    int j, e;
    SqStack S;
    InitStack(S);
    scanf("%d", &j);
    while(j){
        Push(S, j % 8);
        j = j / 8;
    }
    while(StackEmpty(S) != OK){
        Pop(S, e);
        printf("%d", e);
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
	int i;
	int e;
	SqStack S;
	InitStack(S);
	for(i = 1; i < 51; i++){
		Push(S, i * 2);
	}
	cout << "Decimal representation:" << endl;
	for(i = 0; i < 50; i++){
		Pop(S, e);
		cout << e << " ";
		if(i % 10 == 9)
			cout << endl;
	}
	cout << endl;
	cout << "Octal representation:" << endl;
	conversion();
	getchar();
	return 0;
}
這是資料結構的第二個實驗,主要涉及到了棧的構造構造及應用,注意一下程式碼中註釋的地方,這邊的*S.top++ = e;等於*S.top = e;S.top++;這是Push的關鍵。同時注意一下malloc和realloc的用法。

執行結果: