#include <iostream>
#include <stdio.h>
using namespace std;
const MAXSIZE = 100;
typedef struct tagArray
{
int len;
int num[MAXSIZE];
}Array;
int isMax(int n1,int n2)
{
switch(n1)
{
case '+':return 0;break;
case '-':return 0;break;
case '*':
if(n2 == '+'||n2 == '-')
return 1;
else
return 0;
break;
case '/':
if(n2 == '+'||n2 == '-')
return 1;
else
return 0;
break;
default:
cout<<"語法錯誤"<<endl;
exit(1);
break;
}
}
int main()
{
/**//////////////////////
int st[MAXSIZE] = {0};
int top = -1;
//簡單的棧用於保存運算符
/**//////////////////////
Array ay;
memset(&ay,0,sizeof(ay));
//cout<<"大小是多少"<<ay.len<<endl;
//一個存放輸去的緩沖
/**/////////////////////////
int scr[] = {6,'*',4,'-',2,'+',5,'/',2};
const int len = 8;
int ErrorFlag = 0;
for(int i = 0; i < len; i++)
{
if(scr[i]=='+'||scr[i] == '-' || scr[i] == '*' || scr[i] == '/')
{
if(/**//*top == -1 ||*/ isMax(scr[i],st[top]))
{
//棧定元素級別比當前元素要小的時候 把當前運算符壓入棧
st[++top] = scr[i];
}
else
{
//棧頂元素級別比當前元素要大的時候 棧頂元素彈出棧 輸入到輸出緩沖中去 並把當前元素符壓入棧
ay.num[ay.len++] = st[top--]; //放到輸出緩沖去
st[++top] = scr[i];
}
if(!ErrorFlag)
{
cout<< "-----------------------溢出發送錯誤-----------------"<<top<<endl;
cout<<scr[i]<<endl;//結果自己猜想真的 原來保存的是scr[i]的值 我靠
//估計原因是函數調用會保存參數變量的時候 一些溢出 真好產生這樣會的錯誤
//這個懂匯編的話就可能很好解釋了。。。。。。
ErrorFlag = !ErrorFlag;
//這和/*top == -1 ||*/ 一結合 竟然把top 的值進行修改 我還是第一次真正的遇到這個問題
//數組的邊界溢出導致出這樣的問題。 有機會要好好研究一下溢出啊。
// 所以c語言的數組不夠好,沒有邊界的檢測 這樣寫大型程序時候程序出現異常
//st[-1] 地址其實top 的地址 。。
}
}
else
{
//是數字 輸入到輸出緩沖
ay.num[ay.len++] = scr[i];
//cout<<scr[i];
}
}
if(top==-1)
{
cout<<"非法數據"<<endl;
exit(1);
}
cout<<"數組的大小"<<ay.len<<endl;
cout<<"top "<<top<<endl;
//把棧的元素全部輸入緩沖去
do
{
ay.num[ay.len++] = st[top--];
} while (top!=-1);
cout<<"數組的大小"<<ay.len<<endl;
for(int k = 0; k < ay.len; k++)
{
if(ay.num[k] == '+'||ay.num[k] == '-'||ay.num[k] == '*'||ay.num[k] == '/')
{
printf(" %c",ay.num[k]);
}
else
{
cout<<" "<<ay.num[k];
}
}
return 0;
}
作者 小魚兒