該順序棧涉及到了存儲整型數(shù)據(jù)的順序棧還有存儲字符型數(shù)據(jù)的順序棧
實現(xiàn)的功能有:入棧、出棧、判斷是否為空棧、求棧的長度、清空棧、銷毀棧、得到棧頂元素
此外根據(jù)上述功能,編寫了數(shù)值轉換(十進制轉化八進制)方法、括號匹配方法。
#include <stdio.h>
#include <stdlib.h>
#pragma warning(disable:4996)
#include<iostream>
using namespace std;
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OK 1
#define TRUE 1
#define FALSE 0
#define OVERFLOW 0
#define ERROR 0
typedef int Status;
typedef char SChar;
typedef int SElemType;
//定義棧,棧中存儲的數(shù)據(jù)為整型數(shù)據(jù)
typedef struct
{
SElemType* base; //棧底指針
SElemType* top; //棧頂指針
int stacksize; //當前已分配的存儲空間
}SqStackInt, * SqslinkInt; //順序棧說明符
//定義棧,棧中存儲的數(shù)據(jù)為字符型數(shù)據(jù)
typedef struct
{
SChar* base; //棧底指針
SChar* top; //棧頂指針
int stacksize; //當前已分配的存儲空間
}SqStackChar, * SqslinkChar; //順序棧說明符
//下面為 “棧中存儲的數(shù)據(jù)為整型數(shù)據(jù) ”的基本操作
Status InitStackInt(SqStackInt& 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;
}
//求順序棧(整形數(shù)據(jù))的長度
Status StackIntList(SqStackInt& S) {
int list = (S.top - S.base);//棧的頭指針減去尾指針就是長度
printf("該順序棧的長度為:%5d\n", list);
return OK;
}
//清空順序棧(整形數(shù)據(jù))
Status ClearStackInt(SqStackInt& S) {
S.top = S.base;
printf("該整形順序棧已經(jīng)清空!");
return OK;
}
//判斷順序棧(整形數(shù)據(jù))是否為空棧
Status StackEmptyInt(SqStackInt S) {
if (S.base == S.top) {
printf("該整形順序棧是空棧!");
return TRUE;
}
else return FALSE;
}
//在順序棧(整形數(shù)據(jù))中得到棧頂元素
SElemType GetTop(SqStackInt& S, SElemType& e) {
if (S.top == S.base) {
return ERROR;
}
e = *(S.top - 1);//取出棧頂元素
return OK;
}
//在順序棧(整形數(shù)據(jù))中進棧
Status PushInt(SqStackInt& 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);//realloc失敗了
S.top = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;
}
*S.top++ = e;
return OK;
}
//在順序棧(整形數(shù)據(jù))中出棧
Status PopInt(SqStackInt& S, SElemType& e) {
if (S.top == S.base) return ERROR;
e = *--S.top;
// printf("出棧的元素:%5d\n", e);
int numer = e;
return numer;
}
//銷毀順序棧(整形數(shù)據(jù))
Status DestroyStackInt(SqStackInt& S) {
S.stacksize = 0;//銷毀后棧的長度為零
S.top = S.base;
free(S.base);//釋放棧底
S.top = S.base = NULL;
printf("該順序棧已被銷毀");
return OK;
}
//下面為 “棧中存儲的數(shù)據(jù)為字符型數(shù)據(jù) ”的基本操作
Status InitStackChar(SqStackChar& S) {
S.base = (SChar*)malloc(STACK_INIT_SIZE * sizeof(SChar));
if (!S.base)exit(OVERFLOW);
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
return OK;
}
Status ClearStackChar(SqStackChar& S) {
S.top = S.base;
return OK;
}
Status StackEmptyChar(SqStackChar S) {
if (S.base == S.top) return TRUE;
else return FALSE;
}
SChar GetTopChar(SqStackChar& S) {
SChar e;
if (S.top == S.base) return ERROR;
e = *(S.top - 1);
return e;
}
Status PushChar(SqStackChar& S, SChar e) {
if (S.top - S.base >= S.stacksize) {
S.base = (SChar*)realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(SChar));
if (!S.base) exit(OVERFLOW);
S.top = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;
}
*S.top++ = e;
return OK;
}
SChar PopChar(SqStackChar& S, SChar& e) {
if (S.top == S.base) return ERROR;
e = *--S.top;
char data = e;
return data;
}
Status DestroyStackChar(SqStackChar& S) {
free(S.base);
return OK;
}
//數(shù)制轉換算法
void conversion() {
SqStackInt S;
InitStackInt(S);
int N;
printf("請輸入一個數(shù):");
scanf("%d", &N);
while (N) {
PushInt(S, N % 8);//如果N÷8的余數(shù)不為零就進棧
N = N / 8;
}
SElemType e;
while (!StackEmptyInt(S)) {
PopInt(S, e);//所有余數(shù)出棧
printf("%d", e);
}
} // conversion
//括號匹配算法
Status Matching()
{
SqStackChar S;
InitStackChar(S);
int i =0;
char x;
ClearStackChar(S);
SChar E[100];
printf("請輸入一組括號(以#結束):");
scanf("%s", &E);
printf("你輸入的是:%s\n", E);
while (E[i] != '#')
{
if (E[i] == '(' || E[i] == '[') {
PushChar(S, E[i]); //(,[ 進棧
}
if (E[i] ==')' || E[i] == ']')
{
if (StackEmptyChar(S)) {
return(ERROR);
}//不匹配,返回0
else {
x = PopChar(S, E[i]); //出棧,x為相應左括號
if (x == '(' && E[i] == ']' || x == '[' && E[i] == ')') {
return(ERROR);
}
} //不匹配返回0
}
i++;
}
if (StackEmptyChar(S)) return(OK); //括號匹配,返回1
else return(ERROR); //不匹配返回0
} //Matching
int main()
{
SqStackInt int_S;
InitStackInt(int_S);//初始化棧
SElemType enterData_Int;//定義進棧的元素變量,對其賦值
SElemType outData_Int;//元素出棧用此接受
int n;//后面要進行的操做數(shù),可以對其賦值
SElemType e;//定義得到棧頂元素的變量
int result;
while (1)
{
printf("\n\n\n");
printf("請從下面菜單中選擇要操作的項:\n");
printf("1、數(shù)制轉換(十進制轉換八進制)\n");
printf("2、括號匹配\n");
printf("3、整形數(shù)據(jù)元素進棧\n");
printf("4、整形數(shù)據(jù)元素出棧\n");
printf("5、求整形順序棧的長度\n");
printf("6、清空整形順序棧\n");
printf("7、銷毀整形順序棧\n");
printf("8、判斷整形順序棧是否為空棧\n");
printf("9、得到整形順序棧的棧頂元素\n");
printf("0、退出\n");
printf("請輸入1-9的數(shù)或者輸入0結束程序:\n");
scanf("%d", &n);
switch (n) {
case 1:
conversion();
break;
case 2:
result = Matching();
if (result == OK)
printf("括號匹配成功\n");
else
printf("括號匹配不成功\n");
break;
case 3:
printf("請輸入要進棧的整形數(shù)據(jù)元素:\n");
scanf("%d", &enterData_Int);
PushInt(int_S, enterData_Int);
break;
case 4:
/* scanf("%d", &eOut);*/
int num ;
num= PopInt(int_S, outData_Int);
printf("出棧的元素是:%5d\n", num);
break;
case 5:
StackIntList(int_S);
break;
case 6:
ClearStackInt(int_S);
break;
case 7:
DestroyStackInt(int_S);
break;
case 8:
StackEmptyInt(int_S);
break;
case 9:
GetTop(int_S,e);
break;
case 0:
exit(0);
break;
default:printf("輸入數(shù)值錯誤,請重新輸入\n"); break;
}
}
return OK;
}
控制臺界面展示:
進棧展示,以進棧三個整形數(shù)據(jù)元素為例:
出棧展示:
數(shù)值轉換演示,86(十進制數(shù))——>126(八進制):文章來源:http://www.zghlxwxcb.cn/news/detail-818821.html
括號匹配演示:文章來源地址http://www.zghlxwxcb.cn/news/detail-818821.html
到了這里,關于數(shù)據(jù)結構之棧的基本操作的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!