[爆卦]stack c語言是什麼?優點缺點精華區懶人包

為什麼這篇stack c語言鄉民發文收入到精華區:因為在stack c語言這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者lovemost (最愛)看板C_and_CPP標題[問題] 資料結構-用c語言array寫st...



這是用C語言的方式寫的

題目是計算加減乘除四則運算,含括號

因為數字在程式中我認為會出現問題,所以改用abc代替整數
EX:21會被拆成2跟1,為避免這種情形,所以希望改成a=21後進入計算
a=21可以之後再輸入

想法很單純,是用最基礎的括號法,原本是array infix[]
優先權來說 */ > +- > (
)為特例,需pop到(之前的所有符號
遇到數字(abc)就直接印到postfix[]的array中

寫程式的時候有寫了許多註釋...
是我寫程式之前的想法
結果都已經寫了差不多了以後才發覺根本的push和pop都不能執行....
頭都昏了...
目前寫到將infix轉postfix(中序轉後序)
寫法是用array的stack寫法

主要就是pop和push沒辦法照我所想要的方式執行
------------------------------------------

#include<stdio.h>
#include<string.h>
#include<ctype.h>

//只能夠計算加減乘除和左右括號的四則運算
//infix先轉postfix再作計算
//使用方法array的stack

typedef struct STACK
{
char item [100];
int top;
}STACK;
STACK S;

void push(char );
void pop(char *);

int main(){

char infix[100];
char postfix[100];
int i=0,j=0;

S.top=0;

printf("請輸入中序式, 例如 (a+b)*c-d/e :\n");
scanf("%s",infix);

char token,y;

//----開始進行轉換為postfix的動作
//think:將掃的字元分為符號和字母,依括號法字母直接掃入新的array
//運算子-符號則分為( ) + - * / ,左括號一律掃入,直到有右括號對應 " * / "
的優先權大於" + - "

token為進入迴圈後的infix字元,判斷token為何後進行適當處理

while((token=infix[i]) != '\0'){// 進行掃入的工作

if( (token) >='a' && (token)<='z'){postfix[j]=token;j++;}//判斷為字母

else{//為符號-分為6種情況
if(token==')'){//右括號,遇到要把到左括號之前的全部POP出 並除去左括號
y=pop(S);這行開始出錯
while(y != '('){
postfix[j]=y;
j++;
y=pop(S);}//y不等於左括號,印出y
} //end ')'
else if( token=='(' ) push(token);//case '(' >>在stack外優先權最高,stack
內優先權最低
else if(token=='+'){//case '+' 優先權等於 + - 小於 * / 大於(
if( (S.top==0) || (S.item[S.top]=='{')) push(token);
else {y=pop(S);
while(y == '*' || y == '/' || y=='+' || y=='-'){//y是優先權<=
的情況
postfix[j]=y;
j++;
y=pop(S);}//end while
}}//end case '+'
else if(token=='-'){//case '-'
if(S.top==0 || S.item[S.top]=='{') push(token);
else {y=pop(S);
while(y == '*' || y == '/' || y=='+' || y=='-'){//y是優先權<=
的情況
postfix[j]=y;
j++;
y=pop(S);}//end while
}}//end case '-'
else if(token=='*'){//優先權等於 * / 大於( + -
if(S.top==0 || S.item[S.top]=='{' || S.item[S.top]=='+' ||
S.item[S.top]=='-') push(token);
else{y=pop(S);
while(y == '*' || y == '/'){
postfix[j]=y;
j++;
y=pop(S);}
}}//end case '*'
else { //token = '/'
if(S.top==0 || S.item[S.top]=='{' || S.item[S.top]=='+' ||
S.item[S.top]=='-') push(token);
else{y=pop(S);
while(y == '*' || y == '/'){
postfix[j]=y;
j++;
y=pop(S);}
}}//end case '/'
}//end else 符號
i=i+1;
}//end 掃入工作
while(S.top != 0){//當掃入完成後清空stack
y=pop(S);
postfix[j]=y;
j++;}
printf("\n\n%s",postfix);
system("Pause");
return 0;
}//end main

void push(char x){
S.top++;
S.item[S.top]=x;
}

void pop(char *x){
*x=S.item[S.top];
S.top--;
}

請幫幫忙....
我認為應該是設定上哪邊出錯(廢話)
可是我找不出來...

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.169.232.21
sunneo:push應該是S.item[ s.top++ ] = x 04/09 22:17
sunneo:pop則是*x = S.item[ --S.top ]; 04/09 22:18
sunneo:當然你的寫法的問題頂多是第一個位置沒放內容 04/09 22:19
lovemost:馬上去試試... 04/09 22:22
※ 編輯: lovemost 來自: 118.169.232.21 (04/09 22:25)
sunneo:pop函式原型對於 y = pop(S) 不符 04/09 22:27
tsaiminghan:可以用vector嗎?這題目不是要你練習stack 04/09 22:27
tsaiminghan:而是4則運算吧? 04/09 22:27
lovemost:主要是練習stack~這份是資料結構的作業 04/09 22:28
lovemost:我的猜測是程式似乎是副程式輸入和回傳的值不對><" 04/09 22:29
lovemost:我的想法中top一開始等於0~當大於0是有東西~等於0是結束 04/09 22:31
sunneo:我想你目前是語法錯誤吧 04/09 22:45
sunneo:因為pop原型void pop(char*) 但出錯的地方是y=pop(S) 04/09 22:46
sunneo:你期待讓void的函式回傳資料 04/09 22:46
jaw109:建議你先用STL裡面的stack完成功能, 再思考stack該怎麼實作 04/09 23:23

你可能也想看看

搜尋相關網站