#include<StdAfxh>
#include<iostreamh>
#include<stringh>
#include<stdlibh>
/栈/
template <class T>
class CStack
{
public:
int m_count;
T m_arr;
int m_curposition;
CStack(int count)
{
m_arr = new T [count];
m_count = count;
m_curposition = -1;
}
bool push(T val)
{
if(m_curposition == m_count-1)
return false;
m_arr[++m_curposition] = val;
}
T pop()
{
if(IsEmpty())
return 0;
return m_arr[m_curposition--];
}
T GetElement()
{
if(IsEmpty())
return 0;
return m_arr[m_curposition];
}
bool IsEmpty()
{
if(m_curposition < 0)
return true;
return false;
}
~CStack()
{
delete [] m_arr;
}
};
/ *** 作函数定义 /
bool ExpressionIsRight(char pExpression); // 表达式是否正确
bool ProcessExpression(char pExpression); // 处理表达式
int GetIndex(char ch); // 获取 *** 作符在数组中的下标
void Calculate(); // 计算
double GetResult(); // 得到结果
bool IsEnd(char ch); // 表达式是否结束
double GetNum(char pStr, int & i); // 获取 *** 作数
CStack<char> stack_sign(100); // 运算符栈CStack<double> stack_num(100); // *** 作数栈
//运算符号优先级表
int PriTbl[7][7]={
{1,1,-1,-1,-1,1,1},
{1,1,-1,-1,-1,1,1},
{1,1,1,1,-1,1,1},
{1,1,1,1,-1,1,1},
{-1,-1,-1,-1,-1,0,2},
{1,1,1,1,2,1,1},
{-1,-1,-1,-1,-1,2,0}
};
bool ExpressionIsRight(char pExpression)
{
int len = strlen(pExpression);
char arr[7] = {'+','-','','/','(',')',''};
for(int i=0; i<len; i++)
{
if(!(pExpression[i]>='0' && pExpression[i]<='9'))
{
if(pExpression[0] == '' || pExpression[len-1] == '')
return false;
int flag = 0;
for(int j=0; j<sizeof(arr); j++)
{
if(pExpression[i] == arr[j])
{
flag = 1;
break;
}
}
if(flag == 0)
return false;
}
}
return true;
}
bool ProcessExpression(char pExpression)
{
if(!ExpressionIsRight(pExpression))
return false;
int len = strlen(pExpression);
pExpression[len++] = '#';
stack_signpush('#');
if(len == 1)
return false;
for(int i=0; i<len; i++)
{
if(pExpression[i] >= '0' && pExpression[i] <= '9') // *** 作数
{
double val = GetNum(pExpression, i);
stack_numpush(val);
}
else // *** 作符
{
int pre = GetIndex(stack_signGetElement());
int next = GetIndex(pExpression[i]);
switch(PriTbl[pre][next])
{
case -1: // next > pre
stack_signpush(pExpression[i]);
break;
case 0: // next = pre
if(IsEnd(pExpression[i]))
return true;
stack_signpop();
break;
case 1: // next < pre
Calculate();
i--; // back
break;
}
}
}
return true;
}
double GetNum(char pStr, int & i)
{
char Nums[100];
int j = 0;
while((pStr[i] >= '0' && pStr[i] <= '9') || pStr[i]=='')
Nums[j++] = pStr[i++];
i--;
Nums[j] = '\0';
return atof(Nums);
}
int GetIndex(char ch)
{
switch(ch)
{
case '+': return 0;
case '-': return 1;
case '': return 2;
case '/': return 3;
case '(': return 4;
case ')': return 5;
case '#': return 6;
}
}
void Calculate()
{
double num1, num2;
num2 = stack_numpop();
if(stack_numIsEmpty())
{
cout << "表达式错误!" << endl;
exit(0);
}
num1 = stack_numpop();
switch(stack_signpop())
{
case '+': stack_numpush(num1+num2);return;
case '-': stack_numpush(num1-num2);return;
case '': stack_numpush(num1num2);return;
case '/':
{
if(num2 == 0)
{
cout << "除数不能为0!程序终止!" << endl;
exit(0);
}
stack_numpush(num1/num2);
return;
}
}
}
bool IsEnd(char ch)
{
if(ch == '#')
if(stack_signGetElement() == ch)
return true;
return false;
}
double GetResult()
{
if(stack_signGetElement() != '#')
{
cout << "表达式错误!" << endl;
exit(0);
}
return stack_numGetElement();
}
//穷举法
void FindBro1(int pArray,int nCount)
{
int pTemp = new int[nCount];
for(int i=0; i<nCount;i++)
{
pTemp[i]=-1;
for(int j=i+1;j<nCount;j++)
{
if(pArray[j]>=pArray[i])//找到
{
pTemp[i]=j;
break;
}
}
}
cout<<"结果:";
for(int m=0; m<nCount;m++)
{
cout<<pTemp[m]<<" ";
}
cout<<endl<<endl;
delete []pTemp;
}
//栈方法
void FindBro2(int pArray,int nCount)
{
CStack<int> stack_bro(nCount);
for(int i=nCount-1; i>=0;i--)
{
stack_bropush(-1);
for(int j=i+1;j<nCount;j++)
{
if(pArray[j]>=pArray[i])//找到
{
stack_bropop();
stack_bropush(j);
break;
}
}
}
cout<<"结果:";
while(!stack_broIsEmpty())
{
cout<<stack_bropop()<<" ";
}
cout<<endl<<endl;
}
void FindBro(int nmode)//nmode为1时,是用普通穷举法,为2时,加入栈编程
{
int nCount;
cout << "请输入元素个数:\n";
cin>>nCount;
int pArray = new int[nCount];
for(int i=0;i<nCount;i++)
{
printf("请输入第%d个元素的值:\n",i+1);
cin>>pArray[i];
}
if(nmode==1)
{
FindBro1(pArray,nCount);
}
else
{
FindBro2(pArray,nCount);
}
delete []pArray;
return;
}
//表达式
void express()
{
char strExpression[100];
cout << "请输入算术表达式:";
cin >> strExpression; // 输入表达式
if(!ProcessExpression(strExpression)) // 处理表达式
{
cout << "表达式错误!" << endl<<endl;
}
else
cout << "计算结果:" << GetResult() << endl<<endl; // 输出结果
}
void main()
{
cout << "1 表达式求值:\n";
express(); //表达式求值
cout << "2 数组穷举法,找亲兄弟:\n";
FindBro(1); //数组穷举法,找亲兄弟
cout << "3 借助栈编程,找亲兄弟:\n";
FindBro(2); //借助栈进行
}
表达式部分参考了网上的一个方法
查找最大值的程序,不是很简单的吗?
如下即可:
ORG 0H
MOV R0, #30H
ACALL ZI
SJMP $
;-----------------------------------
ZI:
MOV B, #0 ;先用0当做最大值
MOV R7, #16 ;比较16次
LOOP: MOV A, @R0 ;取来一个数字
CJNE A, B, B1 ;比较
B1: JC B2 ;有借位转移
MOV B, A ;够减则存到B中
B2: INC R0 ;转到下一个
DJNZ R7, LOOP ;循环16遍
RET
;-----------------------------------
END
在傍晚的树丛中的葡萄酒壶,
欢迎你,我的生命,我的死亡和我的命运。
因此我想把它掩埋在我的心里
让山峰作为标志留在那里。
当你小小的心脏开始苏醒
以为他根本不在乎是不是力气,哈哈
ORG 0000H
MOV DPTR,#TABLE
MOV R2,A (暂存A中原来的参数)
MOVC A,@A+DPTR ;到表头地址加A中的偏移量处取数
MOV R0,A (把取来的第一个数放在R0中)
XCH A,R2 (把原暂存的A值和和才取的数进行交换存贮)
INC A (因是二字节的这准备取下一个字节的数)
MOVC A,@A+DPTR
MOV R1,A (把取的第二个字放在的R1中)
SJMP $
ORG 2000H
TABLE: DW 0,1,4,9,16,25,36,49,64,81,100,121,144,169
DW
196,225,256,289,324,361,400,441,484,529,576,625,676,729,784,841,900
END
二级“Access语言程序设计”与“数据库程序设计”的区别:
二级“Access语言程序设计是一门语言,比较简单,易学,并且比数据库程序设计简单。而“数据库程序设计”是有后台软件做支撑,实用价值要大一些。
知识扩展:
计算机二级证书的重要性:
首先,计算机二级证书和英语四六级证书一样是找工作的重要法码之一。另外,它还有很多其他的作用:比如,如果你想去上海、北京、天津等城市工作需要在上海、北京、天津落户的话,计算机二级证书是必须的条件之一;企业招聘一般都会要求计算机二级证书,
而不会要求计算机三级证书;大城市的公务员必须要持有二级证书才能上岗;教师上岗除了教师资格证外二级证书也逐渐成为必备要求之一;在职人员加薪二级证书也已逐渐成为必
要条件之一;学习了计算机二级C语言或相关语言还可以对整个计算机的学习起到很大的促进作用,计算机知识浩如瀚海,即使任何资深人士都不可能精通或熟悉所有的计算机软件,但是为什么他们无论什么软件都能很快就上手会用呢,那是因为本质上任何计算机软件都是C语言之类的编程语言开发出来的,所以我们授人以“鱼”不如授人以“渔”,掌握了一门基本的编程语言比如C语言就等于学会了掌握任何计算机软件触类旁通的方法所以计算机二级证书已成为大学生就业不可或缺的敲门砖。由于二级考试种类的难度不一,有的企业已经开始特意要求二级证书必须为C语言。而且考二级证书相对实际一点,如果通过了二级考试并且学有余力的话可以选择继续考三级或者四级。
以上就是关于数据结构 程序设计(C++)全部的内容,包括:数据结构 程序设计(C++)、51单片机 汇编语言 常用数据处理程序设计 求16个无符号数的最大值、c语言程序数据库设计等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)