資料結構實驗之 棧的應用 算數表示式(帶括號)

2021-10-18 01:31:34 字數 2007 閱讀 7115

需要預覽不帶括號情況:

棧的應用之算術表示式(不帶括號)

【設計要求】輸入包含±*/四種運算,(含有()括號的合法算術表示式,且運算元為多位整數,並計算其值,表示式以#開始,並以#結束)。運算符號的優先順序對比如下表所示:

#define stack_init_size 100 //儲存空間初始分配量

#define stackincrement 10 //儲存空間分配增量

typedef char selemtype;

typedef char operandtype; //表示式求值的運算型別

typedef int status;

typedef struct

sqstack;

//構造乙個空棧

status initstack(sqstack* s)

s->top = s->base;

s->stacksize = stackincrement;

return ok;

}//若棧不為空,則用e返回s的棧頂元素,並返回ok;否則返回error

status gettop(sqstack* s, selemtype* e)

//插入元素e為新的棧頂元素

status push(sqstack* s, selemtype e)

s->top = s->base + s->stacksize;

s->stacksize += stackincrement;

} *s->top++ = e;

return ok;

}//若棧不為空,則刪除s的棧頂元素,用e返回其值,並返回ok;否則返回error

status pop(sqstack* s, selemtype* e)

status stackdestroy(sqstack* s)

void clearstack(sqstack* s)//清空棧s,保留棧底指標

char precede(char c1, char c2) ,,,

,,,};

switch (c1)

switch (c2)

return pre[i][j];

}//判斷c是否為運算子

status in(operandtype c)

}//二元運算(a theta b)

operandtype operate(operandtype a, operandtype theta, operandtype b)

return c;

}//算術表示式求值的算符優先演算法,設optr和opnd分別為運算子棧和運算數棧,op為運算子集合

operandtype evaluateexpression()

else

while (c != '#' || x != '#')

}else if (c >= '0' && c <= '9') //c是運算元

while (c >= '0' && c <= '9');

z[i] = 0;

d = atoi(z); //將字元陣列轉為整型存於d

push(&opnd, d);

} else //c為非法字元

gettop(&optr, &x);

} gettop(&opnd, &x);

stackdestroy(&optr);

stackdestroy(&opnd);

return x;

}int main()

鏈棧以及順序棧應用 算數表示式

利用鏈棧將中綴表示式轉化為字尾表示式,然後利用順序棧進行掃瞄計算,返回結果 書上的 1 include 2 include 3 include 4 define size 50 5using namespace std 6 typedef struct node 7 linkstack,stackn...

棧實現表示式計算 資料結構

思路 所包含的運算子有 1 建立兩個棧,乙個用來儲存運算元,另乙個用來儲存運算子,開始時在運算子棧中先壓入 0 乙個表示式的結束符。2 然後從左至右依次讀取表示式中的各個符號 運算元或者運算子 3 如果讀到的是運算元直接存入運算元棧 4 如果讀到的是運算子,則作進一步判斷 若讀到的是 0 結束符,而...

資料結構之 棧的應用

前面幾篇寫的都是資料結構原理性內容,也在寫棧的時候提到了棧的應用場景很欠缺,所以這兩天把棧的幾個應用寫一寫,貼出來以後查閱方便。棧的幾個典型應用例子包括 1 漢諾塔問題 2 括號匹配問題 3 迷宮老鼠問題 4 電路防交叉的佈線問題 接近括號匹配 5 就是這個部落格貼出來的車廂重排問題 其實是乙個排序...